基于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;												
                    }							
            }
        }

  }
}

 

 

 

 

 

 

苏ICP备2024134786号