成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony設備開發(八)- 遙控小車

系統 OpenHarmony
手機碰一碰小車上的NFC標簽,即可一鍵連接小車建立TCP連接,與此同時拉起小車控制軟件,最終完成對小車的控制。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

前言

智能小車設備可以接收手機發送的操控指令,得以完成手機操控小車。智能小車還實現無感連接,無論哪一個智能小車設備,手機只需要對著智能小車上的標簽碰一碰,即可連接到該小車并自動打開相對應的操作軟件,對該小車進行控制,操作簡單易懂,易于上手。

實現方式

  1. 3861鴻蒙小車控制兩個電機,并打開熱點以供手機連接。
  2. NFC標簽寫入鴻蒙小車的SSID,PSK,IP地址。
  3. 手機碰一碰小車上的NFC標簽,即可一鍵連接小車建立TCP連接,與此同時拉起小車控制軟件,最終完成對小車的控制。

工程版本

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

源代碼

頭文件

對于下面要用到的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使能是反方向,同時使能便是停止。

#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. 回調函數配置。
  2. WIFI_AP配置。
  3. 注冊netif結構體。
  4. 配置netif(配置DHCP)。
  5. 關閉再打開DHCP(必須先關閉再重新打開)。
#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;
//注冊wifi事件的回調函數
g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
//指定WiFi回調函數
error = RegisterWifiEvent(&g_wifiEventHandler);
//設置指定的熱點配置
HotspotConfig config = {0};
//初始化熱點相關配置
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熱點
error = SetHotspotConfig(&config);
error = EnableHotspot();
//啟動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);
//關閉
netifapi_dhcps_stop(g_lwip_netif);
netifapi_dhcps_start(g_lwip_netif, 0, 0);
}

TCP

//在sock_fd 進行監聽,在 new_fd 接收新的鏈接
int sock_fd, new_fd;
char recvbuf[10];
/****************以下為TCP服務器代碼***************/
struct sockaddr_in server_sock;
//客戶端地址信息
struct sockaddr_in client_sock;
int sin_size;
struct sockaddr_in *cli_addr;
//創建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_);
//調用bind函數綁定socket和地址
if (bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)) == -1)
{
perror("bind is error\r\n");
exit(1);
}
//調用listen函數監聽(指定port監聽)
if (listen(sock_fd, TCP_BACKLOG) == -1)
{
perror("listen is error\r\n");
exit(1);
}
printf("start accept\n");

//調用accept函數從隊列中
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));
}
//處理目標
ssize_t ret;
while (1)
{
//連接成功,接收客戶端發送來的數據
//清理接收緩存
(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********************/

線程創建以及WiFi回調函數

/ 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;
//獲取當前接入到該AP的所有STA站點信息
error = GetStationList(stainfo, &size);
if (error != WIFI_SUCCESS)
{
printf("HotspotStaJoin:get list fail, error is %d.\r\n", error);
return;
}
sta_list_node = stainfo;
//打印出每個STA站點的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站點加入回調函數
static void OnHotspotStaJoinHandler(StationInfo *info)
{
if (info == NULL)
{
printf("HotspotStaJoin:info is null.\r\n");
}
else
{
//創建連接線程
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退出回調函數
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;
}
//狀態改變回調函數
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表示WIFI 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模塊部分尚未編寫,當前只在軟件內固定連接WiFi以及ip,打開軟件即可控制小車。

#打卡不停更#【FFH】OpenHarmony設備開發(八)- 遙控小車-開源基礎軟件社區

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-09-07 15:35:49

設備開發鴻蒙

2023-07-25 10:42:39

鴻蒙遙控3861小車

2022-10-24 14:54:29

LWIP協議鴻蒙

2022-09-22 15:23:40

設備開發鴻蒙

2021-02-01 13:58:51

鴻蒙HarmonyOS應用開發

2022-09-06 15:25:22

Wifi設備開發

2022-02-15 14:06:36

OpenHarmon操作系統鴻蒙

2022-02-21 15:38:57

Openharmon操作系統鴻蒙

2023-04-25 16:30:58

設備開發鴻蒙

2022-09-28 13:48:13

設備開發鴻蒙

2022-02-15 14:45:14

OpenHarmo系統鴻蒙

2022-09-30 13:50:07

設備開發鴻蒙

2022-07-29 14:29:24

設備開發鴻蒙

2022-02-17 18:08:04

OpenHarmon應用開發鴻蒙

2022-09-20 14:27:23

設備開發鴻蒙

2022-12-22 19:22:55

應用開發鴻蒙

2023-04-21 15:54:08

應用開發鴻蒙

2022-10-12 15:00:02

設備開發應用開發

2022-03-02 16:08:31

Harmony應用開發鴻蒙

2022-01-21 21:22:24

OpenHarmon操作系統鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产黄色在线观看 | 岛国av一区二区 | 成人精品国产 | 国产成人精品网站 | 国产成人精品亚洲日本在线观看 | 国产乱码精品一区二三赶尸艳谈 | 亚洲精品区 | 日日夜夜91 | 日韩一级黄色毛片 | 国产目拍亚洲精品99久久精品 | 亚洲一区免费 | 亚洲免费视频一区 | 欧美一区二区三区国产精品 | 狠狠操狠狠操 | 日本不卡一区二区三区 | 三级黄色片在线观看 | 久久一 | 欧美一区二区三区精品免费 | 天天搞天天操 | 91性高湖久久久久久久久_久久99 | 成人精品在线观看 | 欧美男人天堂 | 欧美色999| 福利视频一区二区 | 中文字幕97 | 国产精品毛片 | 又黑又粗又长的欧美一区 | 91天堂网 | 暖暖日本在线视频 | 亚洲高清免费观看 | 亚洲综合色婷婷 | 日韩精品在线免费观看视频 | 国产黄色在线观看 | 久在线| 天天操网| 天堂va在线 | 黄网站涩免费蜜桃网站 | 你懂的在线视频播放 | 久久91av| 国产在线一区二区三区 | 亚洲iv一区二区三区 |