基于OpenHarmony的智能储物柜目前兼容的OH版本为3.0release~5.0Release。现已兼容我们自己在开源仓库最新的OH发行版源码。此页展示核心的相关功能源码。
网络连接:使设备接电后自动联网
{ int ret; errno_t rc; hi_wifi_assoc_request assoc_req = {0}; /* 拷贝SSID到assoc的req */ /* copy SSID to assoc_req */ rc = memcpy_s(assoc_req.ssid, HI_WIFI_MAX_SSID_LEN + 1, "rui666", 8); //热点名 /* WPA-PSK. CNcomment: 认证类型:WPA2-PSK.CNend */ if (rc != EOK) { return -1; } //热点加密方式 assoc_req.auth = HI_WIFI_SECURITY_WPA2PSK; memcpy(assoc_req.key, "88888888", 11); //热点的密码 ret = hi_wifi_sta_connect(&assoc_req); if (ret != HISI_OK) { return -1; } return 0; } //预置热点名和密码 在设备通电后会自连
上报订阅与下发
void mqtt_callback(MessageData *msg_data) { size_t res_len = 0; uint8_t *response_buf = NULL; char topicname[45] = { "$crsp/" }; LOS_ASSERT(msg_data); printf("topic %.*s receive a message\r\n", msg_data->topicName->lenstring.len, msg_data->topicName->lenstring.data); printf("message is %.*s\r\n", msg_data->message->payloadlen, msg_data->message->payload); } int mqtt_connect(void) { int rc = 0; NetworkInit(&n); NetworkConnect(&n, "a161fa3144.iot-mqtts.cn-north-4.myhuaweicloud.com", 1883); buf_size = 4096+1024; onenet_mqtt_buf = (unsigned char *) malloc(buf_size); onenet_mqtt_readbuf = (unsigned char *) malloc(buf_size); if (!(onenet_mqtt_buf && onenet_mqtt_readbuf)) { printf("No memory for MQTT client buffer!"); return -2; } MQTTClientInit(&mq_client, &n, 1000, onenet_mqtt_buf, buf_size, onenet_mqtt_readbuf, buf_size); MQTTStartTask(&mq_client); data.keepAliveInterval = 30; data.cleansession = 1; data.clientID.cstring = "61f6e729de9933029be57672_88888888_0_0_2022020905"; data.username.cstring = "61f6e729de9933029be57672_88888888"; data.password.cstring = "43872acc0b1e6aa7bf9e6a69f12aa9b1ebc07daffb67e18cf905c847a594f813"; data.cleansession = 1; mq_client.defaultMessageHandler = mqtt_callback; //连接服务器 rc = MQTTConnect(&mq_client, &data); //订阅消息,设置回调函数 MQTTSubscribe(&mq_client, "porsche", 0, mqtt_callback); while(1) { MQTTMessage message; message.qos = QOS1; message.retained = 0; message.payload = (void *)"openharmony"; message.payloadlen = strlen("openharmony"); //上报 if (MQTTPublish(&mq_client, "hi3861", &message) < 0) { printf("MQTTPublish faild !\r\n"); } IoTGpioSetOutputVal(9, 0); //9gpio 0 light on usleep(1000000); } return 0; }
保险模式:密码
static int DealSetPassword(cJSON *objCmd) { int ret = -1; char *pstr = NULL; cJSON *objParas = NULL; cJSON *objPara = NULL; CommandParamSetPsk setLockPskParam; memset(&setLockPskParam, 0x00, sizeof(CommandParamSetPsk)); if ((objParas = cJSON_GetObjectItem(objCmd, "paras")) == NULL) { RaiseLog(LOG_LEVEL_ERR, "Paras not exist"); return ret; } if ((objPara = cJSON_GetObjectItem(objParas, "PskId")) != NULL) { char *id = cJSON_GetStringValue(objPara); //密码标识(string型) if (id == NULL || strlen(id) > LOCK_ID_LENGTH) { RaiseLog(LOG_LEVEL_ERR, "check lock id failed!"); return -1; } strncpy(setLockPskParam.id, id, strlen(id)); } else { return ret; } if ((objPara = cJSON_GetObjectItem(objParas, "Option")) != NULL) { char *option = cJSON_GetStringValue(objPara); printf("option = %c \n", *option); //三个命令(string型) if (*option == 'A') { setLockPskParam.option = OPTION_ADD; //新增密码 } else if (*option == 'U') { setLockPskParam.option = OPTION_UPDATE; //更新密码 } else if (*option == 'D') { setLockPskParam.option = OPTION_DELETE; //删除密码 } else { RaiseLog(LOG_LEVEL_ERR, "no such option(%c)!", *option); return -1; } } else { return ret; } if ((objPara = cJSON_GetObjectItem(objParas, "LockPsk")) != NULL) { char *psk = cJSON_GetStringValue(objPara); if (psk == NULL || strlen(psk) > LOCK_PSK_LENGTH) { RaiseLog(LOG_LEVEL_ERR, "check psk failed!"); return -1; } strncpy(setLockPskParam.password, psk, strlen(psk)); } else { return ret; } ret = IotProfile_CommandCallback(CLOUD_COMMAND_SETPSK, &setLockPskParam); return ret; }
标注GPIO口(例子)
void mqtt_test(void) { IoTGpioInit(9); IoTGpioSetDir(9, IOT_GPIO_DIR_OUT); mqtt_connect(); }
接收服务器的存储代码
exports.i***ta2=function(req,res){ console.log("iot_data:",req) const url = new URL("Get the URL provided by HUAWEI CLOUD"+req.url) //The address configured inside the forwarding destination let properties = JSON.stringify(req.body.notify_data.body.services) console.log("Store data:",properties) let addArr = [properties] var addSql = 'INSERT INTO sesnor_Record(properties) VALUES (?)' var callBack = function(err,data){ console.log("error:"+err) console.log("Property insertion result:"+JSON.stringify(data)) res.send(data) } sqlUtil.sqlContent(addSql,addArr,callBack) }
射频贴纸&复旦卡拉取本地方案
void RC522_Config ( void ) { uint8_t ucStatusReturn; //Returns the status uint8_t flag_station = 1; //Leave the flag bit of the function while ( flag_station ) { /* Seek cards (method: all in the range), the first search fails again, and when the search is successful, the card sequence is passed into the array ucArray_ID*/ if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK ) ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ); if ( ucStatusReturn == MI_OK ) { /* An anti-collision operation in which the selected sequence of cards is passed into an array ucArray_ID */ if ( PcdAnticoll ( ucArray_ID ) == MI_OK ) { if ( PcdSelect ( ucArray_ID ) == MI_OK ) { printf ("\nRC522 is Ready!\n"); flag_station = 0; } } } } }