自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony設(shè)備開發(fā)(八)- 遙控小車

系統(tǒng) OpenHarmony
手機(jī)碰一碰小車上的NFC標(biāo)簽,即可一鍵連接小車建立TCP連接,與此同時(shí)拉起小車控制軟件,最終完成對(duì)小車的控制。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

前言

智能小車設(shè)備可以接收手機(jī)發(fā)送的操控指令,得以完成手機(jī)操控小車。智能小車還實(shí)現(xiàn)無(wú)感連接,無(wú)論哪一個(gè)智能小車設(shè)備,手機(jī)只需要對(duì)著智能小車上的標(biāo)簽碰一碰,即可連接到該小車并自動(dòng)打開相對(duì)應(yīng)的操作軟件,對(duì)該小車進(jìn)行控制,操作簡(jiǎn)單易懂,易于上手。

實(shí)現(xiàn)方式

  1. 3861鴻蒙小車控制兩個(gè)電機(jī),并打開熱點(diǎn)以供手機(jī)連接。
  2. NFC標(biāo)簽寫入鴻蒙小車的SSID,PSK,IP地址。
  3. 手機(jī)碰一碰小車上的NFC標(biāo)簽,即可一鍵連接小車建立TCP連接,與此同時(shí)拉起小車控制軟件,最終完成對(duì)小車的控制。

工程版本

  • 系統(tǒng)版本/API版本:OpenHarmony 3.1 release。
  • IDE版本:DevEco Device Tool Release v3.1.200。

源代碼

頭文件

對(duì)于下面要用到的API接口,我們要引用的頭文件有以下:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
//os
#include "cmsis_os2.h"
#include "ohos_init.h"
//wifi and tcp
#include "wifi_device.h"
#include "wifi_hotspot.h"
#include "wifi_error_code.h"
#include "lwip/netifapi.h"
#include "lwip/sockets.h"
// io
#include "iot_gpio.h"
#include <hi_gpio.h>
#include <hi_io.h>

控制

小車輪子控制:

GPIO0和GPIO1控制左輪,GPIO9和GPIO10控制右輪。

GPIO0和GPIO9使能是正方向,GPIO1和GPIO10使能是反方向,同時(shí)使能便是停止。

#define GPIO0 0
#define GPIO1 1
#define GPIO9 9
#define GPIO10 10
void my_car_init(void)
{//初始化
IoTGpioInit(GPIO0);
IoTGpioInit(GPIO1);
IoTGpioInit(GPIO10);
IoTGpioInit(GPIO9);//IO模式
hi_io_set_func(GPIO0, 0);
hi_io_set_func(GPIO1, 0);
hi_io_set_func(GPIO10, 0);
hi_io_set_func(GPIO9, 0);//輸出模式
IoTGpioSetDir(GPIO0, 1);
IoTGpioSetDir(GPIO1, 1);
IoTGpioSetDir(GPIO10, 1);
IoTGpioSetDir(GPIO9, 1);
car_stop();
}
void car_backward(void)
{
IoTGpioSetOutputVal(GPIO0, IOT_GPIO_VALUE0); //左
IoTGpioSetOutputVal(GPIO1, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO9, IOT_GPIO_VALUE0); //右輪
IoTGpioSetOutputVal(GPIO10, IOT_GPIO_VALUE1);
}
void car_forward(void)
{
IoTGpioSetOutputVal(GPIO0, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO1, IOT_GPIO_VALUE0);
IoTGpioSetOutputVal(GPIO9, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO10, IOT_GPIO_VALUE0);
}
void car_left(void)
{
IoTGpioSetOutputVal(GPIO0, IOT_GPIO_VALUE0);
IoTGpioSetOutputVal(GPIO1, IOT_GPIO_VALUE0);
IoTGpioSetOutputVal(GPIO9, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO10, IOT_GPIO_VALUE0);
}
void car_right(void)
{
IoTGpioSetOutputVal(GPIO0, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO1, IOT_GPIO_VALUE0);
IoTGpioSetOutputVal(GPIO9, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO10, IOT_GPIO_VALUE1);
}
void car_stop(void)
{
IoTGpioSetOutputVal(GPIO0, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO1, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO9, IOT_GPIO_VALUE1);
IoTGpioSetOutputVal(GPIO10, IOT_GPIO_VALUE1);
}

通信

WIFI

  1. 回調(diào)函數(shù)配置。
  2. WIFI_AP配置。
  3. 注冊(cè)netif結(jié)構(gòu)體。
  4. 配置netif(配置DHCP)。
  5. 關(guān)閉再打開DHCP(必須先關(guān)閉再重新打開)。
#define AP_SSID "FSR"
#define AP_PSK "12345678"
#define _PROT_ 8888
#define TCP_BACKLOG 10
static struct netif *g_lwip_netif = NULL;
static int g_apEnableSuccess = 0;
WifiEvent g_wifiEventHandler = {0};
WifiErrorCode error;
//注冊(cè)wifi事件的回調(diào)函數(shù)
g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
//指定WiFi回調(diào)函數(shù)
error = RegisterWifiEvent(&g_wifiEventHandler);
//設(shè)置指定的熱點(diǎn)配置
HotspotConfig config = {0};
//初始化熱點(diǎn)相關(guān)配置
strcpy(config.ssid, AP_SSID);
strcpy(config.preSharedKey, AP_PSK);
config.securityType = WIFI_SEC_TYPE_PSK;
config.band = HOTSPOT_BAND_TYPE_2G; // 2.4GHz
config.channelNum = 7;
//配置wifi熱點(diǎn)
error = SetHotspotConfig(&config);
error = EnableHotspot();
//啟動(dòng)dhcp
g_lwip_netif = netifapi_netif_find("ap0");
if (g_lwip_netif)
{
ip4_addr_t bp_gw;
ip4_addr_t bp_ipaddr;
ip4_addr_t bp_netmask;
IP4_ADDR(&bp_gw, 192, 168, 1, 1); /* input your gateway for example: 192.168.1.1 */
IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1); /* input your IP for example: 192.168.1.1 */
IP4_ADDR(&bp_netmask, 255, 255, 255, 0); /* input your netmask for example: 255.255.255.0 */
netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw);
//關(guān)閉
netifapi_dhcps_stop(g_lwip_netif);
netifapi_dhcps_start(g_lwip_netif, 0, 0);
}

TCP

//在sock_fd 進(jìn)行監(jiān)聽,在 new_fd 接收新的鏈接
int sock_fd, new_fd;
char recvbuf[10];
/****************以下為TCP服務(wù)器代碼***************/
struct sockaddr_in server_sock;
//客戶端地址信息
struct sockaddr_in client_sock;
int sin_size;
struct sockaddr_in *cli_addr;
//創(chuàng)建socket
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket is error\r\n");
exit(1);
}
bzero(&server_sock, sizeof(server_sock));
server_sock.sin_family = AF_INET;
server_sock.sin_addr.s_addr = htonl(INADDR_ANY);
server_sock.sin_port = htons(_PROT_);
//調(diào)用bind函數(shù)綁定socket和地址
if (bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)) == -1)
{
perror("bind is error\r\n");
exit(1);
}
//調(diào)用listen函數(shù)監(jiān)聽(指定port監(jiān)聽)
if (listen(sock_fd, TCP_BACKLOG) == -1)
{
perror("listen is error\r\n");
exit(1);
}
printf("start accept\n");

//調(diào)用accept函數(shù)從隊(duì)列中
while (1)
{
sin_size = sizeof(struct sockaddr_in);

if ((new_fd = accept(sock_fd, (struct sockaddr *)&client_sock, (socklen_t *)&sin_size)) == -1)
{
perror("accept");
continue;
}
cli_addr = malloc(sizeof(struct sockaddr));
printf("accept addr\r\n");
if (cli_addr != NULL)
{
memcpy(cli_addr, &client_sock, sizeof(struct sockaddr));
}
//處理目標(biāo)
ssize_t ret;
while (1)
{
//連接成功,接收客戶端發(fā)送來(lái)的數(shù)據(jù)
//清理接收緩存
(void)memset_s(recvbuf, sizeof(recvbuf), 0, sizeof(recvbuf));
//接收
if ((ret = recv(new_fd, recvbuf, sizeof(recvbuf), 0)) == -1)
{
printf("recv error \r\n");
}
else
{
printf("server:%d!\n", recvbuf[0]);
}
if (recvbuf[0] == '1')
{
car_forward();
printf("car_forward!\n");
}
else if (recvbuf[0] == '2')
{
car_backward();
printf("car back!");
}
else if (recvbuf[0] == '3')
{
car_left();
}
else if (recvbuf[0] == '4')
{
car_right();
}
else if (recvbuf[0] == '0')
{
car_stop();
}
}
close(new_fd);
}
/*********************END********************/

線程創(chuàng)建以及WiFi回調(diào)函數(shù)

/ WIFI連入的線程
static void HotspotStaJoinTask(void)
{
static char macAddress[32] = {0};
StationInfo stainfo[WIFI_MAX_STA_NUM] = {0};
StationInfo *sta_list_node = NULL;
unsigned int size = WIFI_MAX_STA_NUM;
//獲取當(dāng)前接入到該AP的所有STA站點(diǎn)信息
error = GetStationList(stainfo, &size);
if (error != WIFI_SUCCESS)
{
printf("HotspotStaJoin:get list fail, error is %d.\r\n", error);
return;
}
sta_list_node = stainfo;
//打印出每個(gè)STA站點(diǎn)的MAC地址
for (uint32_t i = 0; i < size; i++, sta_list_node++)
{
unsigned char *mac = sta_list_node->macAddress;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("HotspotSta[%d]: macAddress=%s.\r\n", i, macAddress);
}
g_apEnableSuccess++;
}
//綁定STA站點(diǎn)加入回調(diào)函數(shù)
static void OnHotspotStaJoinHandler(StationInfo *info)
{
if (info == NULL)
{
printf("HotspotStaJoin:info is null.\r\n");
}
else
{
//創(chuàng)建連接線程
printf("New Sta Join\n");
osThreadAttr_t attr;
attr.name = "HotspotStaJoinTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 2048;
attr.priority = 24;
if (osThreadNew((osThreadFunc_t)HotspotStaJoinTask, NULL, &attr) == NULL)
{
printf("HotspotStaJoin:create task fail!\r\n");
}
}
return;
}
// STA退出回調(diào)函數(shù)
static void OnHotspotStaLeaveHandler(StationInfo *info)
{
if (info == NULL)
{
printf("HotspotStaLeave:info is null.\r\n");
}
else
{
static char macAddress[32] = {0};
unsigned char *mac = info->macAddress;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("HotspotStaLeave: macAddress=%s, reason=%d.\r\n", macAddress, info->disconnectedReason);
g_apEnableSuccess--;
}
return;
}
//狀態(tài)改變回調(diào)函數(shù)
static void OnHotspotStateChangedHandler(int state)
{
printf("HotspotStateChanged:state is %d.\r\n", state);
if (state == WIFI_HOTSPOT_ACTIVE) // state=1表示已啟用WIFI AP模式
{
printf("wifi hotspot active.\r\n");
}
else // state=0表示W(wǎng)IFI AP模式已禁用
{
printf("wifi hotspot noactive.\r\n");
}
}
static void Wifi_AP_Demo(void)
{
osThreadAttr_t attr;
attr.name = "WifiAPTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 10240;
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)WifiAPTask, NULL, &attr) == NULL)
{
printf("Falied to create WifiAPTask!\r\n");
}
}
SYS_RUN(Wifi_AP_Demo);

效果

因API8暫未開放NFC讀取,因此NFC模塊部分尚未編寫,當(dāng)前只在軟件內(nèi)固定連接WiFi以及ip,打開軟件即可控制小車。

#打卡不停更#【FFH】OpenHarmony設(shè)備開發(fā)(八)- 遙控小車-開源基礎(chǔ)軟件社區(qū)

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??。

責(zé)任編輯:jianghua 來(lái)源: 51CTO開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-09-07 15:35:49

設(shè)備開發(fā)鴻蒙

2023-07-25 10:42:39

鴻蒙遙控3861小車

2022-10-24 14:54:29

LWIP協(xié)議鴻蒙

2022-09-22 15:23:40

設(shè)備開發(fā)鴻蒙

2021-02-01 13:58:51

鴻蒙HarmonyOS應(yīng)用開發(fā)

2022-09-06 15:25:22

Wifi設(shè)備開發(fā)

2022-02-15 14:06:36

OpenHarmon操作系統(tǒng)鴻蒙

2022-02-21 15:38:57

Openharmon操作系統(tǒng)鴻蒙

2023-04-25 16:30:58

設(shè)備開發(fā)鴻蒙

2022-09-28 13:48:13

設(shè)備開發(fā)鴻蒙

2022-02-15 14:45:14

OpenHarmo系統(tǒng)鴻蒙

2022-09-30 13:50:07

設(shè)備開發(fā)鴻蒙

2022-07-29 14:29:24

設(shè)備開發(fā)鴻蒙

2022-12-22 19:22:55

應(yīng)用開發(fā)鴻蒙

2022-02-17 18:08:04

OpenHarmon應(yīng)用開發(fā)鴻蒙

2022-09-20 14:27:23

設(shè)備開發(fā)鴻蒙

2023-04-21 15:54:08

應(yīng)用開發(fā)鴻蒙

2022-10-12 15:00:02

設(shè)備開發(fā)應(yīng)用開發(fā)

2022-03-02 16:08:31

Harmony應(yīng)用開發(fā)鴻蒙

2022-01-21 21:22:24

OpenHarmon操作系統(tǒng)鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)