很多物联网设备没有人机界面,这些设备可以通过手机,手表,平板,电脑等来进行显示和操控,能够提升操作的便捷性和设备的智能化水平。手头有鸿蒙开发版,我的荣耀手机也刚升级了鸿蒙系统,刚好可以做一个手机控制的智能灯实验。
一、环境准备
Windows10
设备开发: DevEco Device Tool 2.2 Beta2
应用开发: DevEco Studio 2.2 Beta1
源码:OpenHarmony 2.0 Canary 下载
Windows开发环境准备官网
OpenHarmony 2.0 Canary源码开发Hi3861,首先在device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk中打开I2C和PWM开关,在base\iot_hardware\peripheral\interfaces\kits增加和完善Adc,I2C,Gpio的功能和接口。
二、材料准备
1.小熊派 BEARPI-HM Nano Hi3861 主板
2.小熊派 E53_SC1扩展板
3.装配好如图
三、简介
E53_SC1扩展板的BH1750传感器采集光照强度,通过I2C传给Hi3861,Hi3861作为TCP服务器,将光强和灯状态信息定时打包发给手机TCP客户端,手机接收后在屏幕显示,手机端开灯\关灯操作命令,通过TCP发送给服务端HI3861,解码后控制Gpio 7点亮或关闭LED灯。
四、设备端Hi3861代码
1.IO口初始化
- static void E53_SC1_INT_IO_Init(void)
- {
- IoTGpioInit(7);
- IoTGpioSetFunc(7,IOT_GPIO_FUNC_GPIO_7_GPIO);
- IoTGpioSetDir(7, IOT_GPIO_DIR_OUT);//设置GPIO_7为输出模式
- IoTGpioInit(0);
- IoTGpioSetFunc(0, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA
- IoTGpioInit(1);
- IoTGpioSetFunc(1, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL
- IoTI2cInit(IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */
- IoTGpioInit(11);
- IoTGpioSetFunc(11,IOT_GPIO_FUNC_GPIO_11_GPIO);
- IoTGpioSetDir(11, IOT_GPIO_DIR_IN); //设置GPIO_11为输入模式,按键F1本地开灯
- IoTGpioSetPull(11, IOT_GPIO_PULL_UP);
- IoTGpioRegisterIsrFunc(11, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, F1_Pressed, NULL);
- IoTGpioInit(12);
- IoTGpioSetFunc(12,IOT_GPIO_FUNC_GPIO_12_GPIO);
- IoTGpioSetDir(12, IOT_GPIO_DIR_IN); //设置GPIO_12为输入模式,按键F2本地关灯
- IoTGpioSetPull(12, IOT_GPIO_PULL_UP);
- IoTGpioRegisterIsrFunc(12, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, F2_Pressed, NULL);
- }
2.BH1750驱动采用小熊派官方驱动
3.数据打包上报
- static void deal_report_msg(report_t *report)
- {
- char *msg;
- uint8_t ret;
- profile_service_t service;
- profile_kv_t lux;
- profile_kv_t light;
- //配置要发送的数据
- service.event_time = NULL;
- service.service_id = "Smart_Light";
- service.service_property = &lux;
- service.nxt = NULL;
- lux.key = "Lux";
- lux.value = &report->lux;
- lux.type = PROFILE_VALUE_INT;
- lux.nxt = &light;
- light.key = "Light";
- light.value = light_status ? "ON" : "OFF";
- light.type = PROFILE_VALUE_STRING;
- light.nxt = NULL;
- msg = profile_package_propertyreport(&service);
- if (send(new_fd, msg, strlen(msg), 0) < 0)
- {
- printf("send error\r\n");
- close(new_fd);
- }
- return;
- }
4.接收命令处理
- int deal_command_task(void)
- {
- ssize_t ret;
- struct sockaddr_in client_sock;
- int sin_size;
- while (1)
- {
- printf("start accept\n");
- sin_size = sizeof(struct sockaddr_in);
- if ((new_fd = accept(sock_fd, (struct sockaddr *)&client_sock, (socklen_t *)&sin_size)) == -1)
- {
- perror("accept");
- }
- printf("accept succeed\n");
- is_accepted = 1;
- while (1)
- {
- bzero(recvbuf, sizeof(recvbuf));
- if (recv(new_fd, recvbuf, sizeof(recvbuf), 0) < 0)
- {
- printf("recv error\r\n");
- close(new_fd);
- is_accepted = 0;
- break;
- }
- else
- {
- if (NULL != strstr(recvbuf, "Light"))
- {
- //开启灯
- if (NULL != strstr(recvbuf, "ON"))
- {
- Light_StatusSet(ON);
- light_status = 1;
- printf("Light On!\r\n");
- }
- //关闭灯
- else if (NULL != strstr(recvbuf, "OFF"))
- {
- Light_StatusSet(OFF);
- light_status = 0;
- printf("Light Off!\r\n");
- }
- }
- }
- }
- }
- }
五、手机代码
1.下载小熊派开源社区源码
2.DevEco Studio打开后,修改应用代码配置文件 entry\src\main\config.json 中的 bundleName,为AppGallery Connect 应用中配置的应用包名。
3.修改 entry\src\main\js\default\pages.index\index.js 中的 bundleName,保持和config.json 中一致。
4.定义src/main/js/default/pages/index/index.js文件
- data: {
- title: '鸿联-智能灯',
- ipaddress:'192.168.',
- port:"5678",
- send_value:0,
- startflag: false,
- client_statu: false,
- subscribe_statu: false,
- property:[
- {
- "name":"光照",
- "propertyName":"Lux",
- "unit":" lux"
- }
- ],
- command:[
- {
- "name":"庭院灯",
- "paraName":"Light",
- "type":"string"
- }
- ],
- properties:{
- "Lux":0,
- "Light":""
- }
- },
5.自动签名后,下载到手机
六、使用
1.开发版编译下载后,重启,会自动连接到WiFi,并建立TCP服务器,等待手机客户端接入
2.手机连接相同 WiFi,查看开发板 IP 为 192.168.43.239,打开手机端的智能灯 APP,点击右上角的加号按钮,输入开发板的 IP 192.168.43.239 和端口5678,点击OK 后会自动连接开发板。
3.开发板将采集的光照数据传送到手机上显示,手机开关灯,开发板LED灯按指令亮和灭。
实验完成,后续将不断改进。