精华内容
下载资源
问答
  • OneNET云平台

    千次阅读 2020-11-24 00:05:25
    OneNET云平台 由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网解决方案。 OneNET致力于开发者的体验,逐步...

    OneNET云平台

    由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网解决方案。

    OneNET致力于开发者的体验,逐步提升云服务体量,着手用户运营,深化运维管理和云端大数据分析,协同产业上下游,长期发展以“大连接、云平台、轻应用、大数据”为架构的平台级服务,打造用户导向的物联网生态环境。作为“云管端”核心布局的OneNET秉承中国移动的发展理念。

    云平台架构

    OneNET已构建“云-网-边-端”整体架构的物联网能力,具备接入增强、边缘计算、增值能力、AI、数据分析、一站式开发、行业能力、生态开放8大特点。全新版本OneNET平台,向下延展终端适配接入能力,向上整合细分行业应用,可提供设备接入、设备管理等基础设备管理能力,以及位置定位LBS、远程升级OTA、数据可视化View、消息队列MQ等PaaS能力。同时随着5G网络的到来,平台也在打造5G+OneNET新能力,重点提供并优化视频能力Video、人工智能AI、边缘计算Edge等产品能力,通过高效、稳定、多样的组合式服务,让各项应用实现轻松上云,完美赋能行业端到端应用。

    架构

    主要功能

    设备接入(主流标准协、多种语言开发SDK)
    设备管理(数据存储、生命周期)
    位置定位LBS(NB-IoT基站定位)
    远程升级OTA(终端模组、终端MCU)
    消息队列MQ(TLS加密传输)
    数据可视化View(对接OneNET内置数据)
    人工智能AI(API方式)
    视频能力Video(Onvif视频)
    边缘计算Edge (“云-边”协同)
    应用开发环境(SaaS应用)

    应用场景

    OneNET物联网专网已经应用于环境监控、远程抄表、智慧农业、智能家电、智能硬件、节能减排、车联网、工业控制、物流跟踪等多种商业领域。物联网开放平台OneNET通过打造接入平台、能力平台、大数据平台能力满足物联网领域设备连接、协议适配、数据存储、数据安全、大数据分析等平台级服务需求。

    功能

    产品创建

    1、OneNET网址
    2、OneNET支持“个人用户”和“企业用户”两种入驻方式,您可以根据您的实际情况选择注册方式
    注册
    3、注册完成后,回到主页点击“登录”,即可进入OneNET的官方主页,并由此进入到您的“控制台”,点击“控制台”,进入全部产品服务,选择多协议接入

    控制台4、MQTT、HTTP、EDP等是不同协议,选择一个协议,下图选择的是HTTP协议。组点击右上角的 “添加产品”,在弹出页面中按照提示填写产品的基本信息,进行产品创建;在创建过程中,有些内容若还不能确定,可暂时先选一个,后期再进行修改

    协议
    添加产品

    产品
    5、创建完成之后,在多协议接入—HTTP下面可以看到刚创建的产品,单击产品,进入产品详情页面,选择设备列表,点击右上方添加设备

    产品
    添加设备

    设备6、使用在线模拟器

    1)、创建产品后,可以利用OneNET云平台提供的在线调试功能,模拟数据的上传,需要知道设备ID和产品API-key
    APIKey在产品概况中,点击Master-APIKey下的查看,会发送验证码到注册时用的手机号,输入验证码,再次点击查看,可以看到APIkey

    API

    2)、数据模拟器

    上传内容范例:,;hightemp,89

    API

    3)、反馈

    反馈
    4)、回到设备列表,点击设备对应的数据流,看到刚上传的数据内容

    数据流
    7、使用网络调试助手调试

    网络调试助手

    // 数据范例
    POST /devices/650072788/datapoints?type=5 HTTP/1.1
    api-key: R5TdhYNJ=zg1=zi3Gkfi8LGl=Ng=
    Host:api.clouds.com
    Content-Length:13
    
    ,;hightemp,86
    
    

    调试

    设计原则

    • 使用标准HTTP方法实现资源CURD操作;
    • 采用json作为API输入输出;
    • 以json输出错误信息。
    HTTP 方法 描述
    POST 新增资源信息
    PUT 更新资源信息
    GET 查看资源信息
    DELETE 删除资源

    支持的返回码列表:

    表格

    文本数据上传

    HTTP方法 POST
    URL http://api.heclouds.com/devices/<device_id>/datapoints
    HTTP头部 api-key:xxxx-ffff-zzzzz
    HTTP内容 有多种数据格式
    请求返回 {“errno”: 0,
    “error”:“succ”,}

    二进制数据上传

    功能:将二进制的数据保存到设备云,设备云返回该二进制数据的索引;并根据参数,将二进制数据作为数据点保存到设备下的某个数据流

    HTTP方法 POST
    URL http://api.heclouds.com/bindata
    HTTP头部 api-key:xxxx-ffff-zzzzz
    URL参数 device_id,必选,该数据所属设备。
    datastream_id,必选,该数据所属数据流。
    HTTP内容 普通二进制数据、文件、图像
    请求返回 {“errno”: 0,
    “error”:“succ”,
    “data”:{
    //该数据在设备云的索引
    "index":“AJOWFW1133OFO2Z93”}}
    展开全文
  • 使用OneNET云平台所配备的应用编辑器功能,可以自定义的生成开发者所需要的应用。 4.3触发器的使用 触发器功能同时也是该平台所赋予的功能,实现当数据超过阈值时,发出邮件提醒用户。 4.4 与OneNET云平台...

    4.1设备的注册
    在进行OneNET平台开发者账号注册之后,进入开发者中心,进行项目应用以及设备的新建、添加数据流等操作。
    这里写图片描述

    4.2应用的编辑
    使用OneNET云平台所配备的应用编辑器功能,可以自定义的生成开发者所需要的应用。
    这里写图片描述

    4.3触发器的使用
    触发器功能同时也是该平台所赋予的功能,实现当数据超过阈值时,发出邮件提醒用户。
    这里写图片描述

    4.4 与OneNET云平台交互控制程序(部分)

    //==========================================================
    //	函数名称:	ESP8266_GetIPD
    //
    //	函数功能:	获取平台返回的数据
    //
    //	入口参数:	等待的时间(乘以10ms)
    //
    //	返回参数:	平台返回的原始数据
    //
    //	说明:		不同网络设备返回的格式不同,需要去调试
    //				如ESP8266的返回格式为	"+IPD,x:yyy"	x代表数据长度,yyy是数据内容
    //==========================================================
    unsigned char *ESP8266_GetIPD(unsigned short timeOut)
    {
    	char *ptrIPD = NULL;
    	do
    	{
    		if(ESP8266_WaitRecive() == REV_OK)								//如果接收完成
    		{
    			ptrIPD = strstr((char *)esp8266_buf, "IPD,");				//搜索“IPD”头
    			if(ptrIPD == NULL)											//如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
    			{
    				//UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");
    			}
    			else
    			{
    				ptrIPD = strchr(ptrIPD, ':');							//找到':'
    				if(ptrIPD != NULL)
    				{
    					ptrIPD++;
    					return (unsigned char *)(ptrIPD);
    				}
    				else
    					return NULL;	
    			}
    		}
    		DelayXms(5);													//延时等待
    	} while(timeOut--);
    	return NULL;														//超时还未找到,返回空指针
    }
    
    //==========================================================
    //	函数名称:	OneNet_RevPro
    //
    //	函数功能:	平台返回数据检测
    //
    //	入口参数:	dataPtr:平台返回的数据
    //
    //	返回参数:	无
    //
    //	说明:		
    //==========================================================
    void OneNet_RevPro(unsigned char *cmd)
    {
    	EDP_PACKET_STRUCTURE edpPacket = {NULL, 0, 0, 0};	//协议包
    	char *cmdid_devid = NULL;
    	unsigned short cmdid_len = 0;
    	char *req = NULL;
    	unsigned int req_len = 0;
    	unsigned char type = 0;
    	short result = 0;
    	char *dataPtr = NULL;
    	char numBuf[10];
    	int num = 0;
    	type = EDP_UnPacketRecv(cmd);
    	switch(type)							//判断是pushdata还是命令下发
    	{
    		case CMDREQ:									//解命令包
    	    result = EDP_UnPacketCmd(cmd, &cmdid_devid, &cmdid_len, &req, &req_len);
    			if(result == 0)					//解包成功,则进行命令回复的组包
    			{
    				EDP_PacketCmdResp(cmdid_devid, cmdid_len, req, req_len, &edpPacket);
    				UsartPrintf(USART_DEBUG, "cmdid: %s, req: %s, req_len: %d\r\n", cmdid_devid, req, req_len);
    			}
    			
    		break;	
    		case SAVEACK:
    		if(cmd[3] == MSG_ID_HIGH && cmd[4] == MSG_ID_LOW)
    		{
    UsartPrintf(USART_DEBUG, "Tips:	Send %s\r\n", cmd[5] ? "Err" : "Ok");
    		}
    			else
    	UsartPrintf(USART_DEBUG, "Tips:	Message ID Err\r\n");
    	break;
    			
        default:
    		result = -1;
    		break;
    	}
    	
    	ESP8266_Clear();									//清空缓存
    	if(result == -1)
    		return;
    	dataPtr = strchr(req, ':');							//搜索':'
    	if(dataPtr != NULL)									//如果找到了
    	{
    	dataPtr++;
    	while(*dataPtr >= '0' && *dataPtr <= '9')//判断是否是下发的命令控制数据
    		{
    			numBuf[num++] = *dataPtr++;
    		}
    		num = atoi((const char *)numBuf);				//转为数值形式
    		if(strstr((char *)req, "button"))				//搜索"button"
    		{
    			if(num == 1)						//控制数据如果为1,代表开
    			{
    				relay_on();
    			}
    			else if(num == 0)					//控制数据如果为0,代表关
    			{
    				relay_off();
    			}
    		}
    
    	}
    	
    	if(type == CMDREQ && result == 0)			//如果是命令包 且 解包成功
    	{
    		EDP_FreeBuffer(cmdid_devid);						//释放内存
    		EDP_FreeBuffer(req);
    															//回复命令
    		ESP8266_SendData(edpPacket._data, edpPacket._len);	//上传平台
    		EDP_DeleteBuffer(&edpPacket);						//删包
    	}
    
    }
    

    在此感谢OneNET云平台所给与的强大的开发平台。

    2020-10-18更新
    PS:源码已share在github。

    https://github.com/tancolin/SmartHome_proto.git
    
    展开全文
  • 基于OneNET云平台的智慧水务解决方案
  • mqttclient连接到OneNET云平台

    千次阅读 2020-06-15 23:07:02
    文章目录mqttclient连接到OneNET云平台使用OneNET测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行代码使用到的API mqttclient连接到OneNET云平台 有了前面连接百度云的经验,...

    mqttclient连接到OneNET云平台

    有了前面连接百度云的经验,废话不多说,直接使用OneNET,OneNET平台应该是最开放,对开发者最友好的平台了。

    使用OneNET

    首先注册与登陆OneNET,然后进入开发者中心:https://open.iot.10086.cn/develop/global/product/#/public?protocol=3&other=1, 选择公有协议产品,点击“添加产品”,填写产品相关的信息,联网方式选择wifi(其实我们是以太网,但是没有这个选项,那就选择wifi,没啥影响的),接入协议必须选择MQTT,操作系统选择“linux”,运营商这个随意选择,具体见:

    mqtt-onenet001

    在添加产品完毕,继续添加设备,填写设备的相关信息,鉴权信息就是登陆密码,不过需要注意的是,这个鉴权信息在产品内是唯一的,一般推荐使用产品序列号,可作为设备登录参数之一,不同协议设备可能鉴权信息的参数不一致,不过现在是做实验,选择一个好记的即可,数据保密性要选择公有,除此之外还剩下一些设备相关的信息,就不过多赘述,具体见图:

    mqtt-onenet002

    mqtt-onenet003

    mqtt-onenet004

    经过上面的步骤,我们就创建完成一个产品了,此时可以去测试连接它。

    测试连接

    OneNET的数据交互做的很好,它支持动态创建主题(除系统主题外),即不用我们在平台上创建任何的主题,只需要随意订阅某个主题即可,同一个产品下,即使是不同设备之间的主题之间的消息是共享的,简单来说,我们在开发板上可以随意向某个主题发起订阅请求,也可以向这个主题发布消息,而同一产品的其他设备如果订阅了这个主题,那么将收到开发板发布的消息数据,这样子更加方便嵌入式的开发者,只不过这样子的信息安全就没有阿里云物联那么好。

    我们可以在这个网页中去查看服务器的IP地址:https://open.iot.10086.cn/doc/multiprotocol/book/problem/platformaddress.html, 对于服务器的地址,onenet分为了不同的地区平台,不过我们一般正常使用的都是中心平台。

    mqtt-onenet005

    现在我们打开MQTT软件,进行连接测试,与前面的实验操作是一样的,配置好相关信息,即可,这些信息都可以在平台上找到,需要注意的是服务器地址是183.230.40.39;端口号是6002,这与我们常见的1883是不一样的;Client ID是设备ID,在设备列表中是可以找到的;用户名是产品ID,在产品概况页面中可以找到;密码就是创建设备时候的鉴权信息,具体见:

    mqtt-onenet006

    mqtt-onenet007

    mqtt-onenet008

    接下来我们可以通过MQTT软件来测试一下能否正常连接,在这一步之前必须已在物联网平台控制台中创建产品和设备,并获取设备相关的信息。

    其实连接是与百度天工差不多的,直接填写相关的内容即可:

    mqtt-onenet009

    配置好就可以连接,然后随便订阅一个主题,因为OneNet平台支持动态创建主题(除系统主题外),所以对我们来说是非常方便的,直接订阅就好了,然后再用客户端进行发布消息,如果收到消息,表明通信成功,

    mqtt-onenet010

    mqtt-onenet011

    回到OneNet的设备列表界面,可以看到刚刚创建的设备是处于在线状态的:

    mqtt-onenet012

    手动安装相关的依赖包

    这些依赖包是使用mqttclient库去连接OneNet云时必须要安装的。

    sudo apt-get -y install git
    
    sudo apt-get -y install mkae
    
    sudo apt-get -y install gcc
    
    sudo apt-get -y install g++
    
    sudo apt-get -y install cmake
    

    拉取mqttclient仓库

    接着到github拉取这个仓库,仓库非常小,下载下来是很快的,注意,这里也需要拉取下来。

    git clone https://github.com/jiejieTop/mqttclient.git
    

    当然也可以从gitee仓库下载。

    git clone https://gitee.com/jiejieTop/mqttclient.git
    

    简单介绍mqttclient仓库文件夹

    • common文件夹:是一些通用的文件内容,比如链表的处理,错误代码的处理、随机数生成器、日志库等内容。

    • mqtt文件夹:著名的paho mqtt库。

    • mqttclient文件夹:实现mqttclient的主要文件,并且包含了一个默认的配置文件。

    • network文件夹:网络抽象层,封装了mbedtls加密库、网络数据的通道类型,自动选择tls加密传输或者是tcp直连。

    • platform文件夹:平台抽象层,此处封装了各种平台的内存管理、互斥锁、线程管理、时间管理等内容,如linux平台,freertos平台、rt-thread平台、TencentOS tiny平台等。

    • test文件夹:一些测试的代码,比如我们连接OneNet云的时候,就会使用test文件夹的OneNet云平台的测试代码。

    编译

    拉取下来后看到本地有mqttclient文件夹,我们进去mqttclient目录下,运行它提供的编译脚本,它主要是通过cmake去自动构建整个代码工程。

    ./build.sh
    
    # 产生的信息如下:
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/jiejie/github/mqttclient/build
    [  9%] Built target mqtt
    [ 12%] Built target common
    [ 17%] Built target platform
    [ 21%] Built target wrapper
    [ 85%] Built target mbedtls
    [ 88%] Built target network
    [ 90%] Built target mqttclient
    [ 92%] Built target arch
    [ 95%] Built target salof
    [ 97%] Built target emqx
    [ 98%] Built target onenet
    [ 99%] Built target baidu
    [100%] Built target ali
    

    运行

    当编译完成后,在./build/bin目录下会出现多个可执行文件,在./build/lib目录下会出现相关的动态库文件,具体如下:

    ➜  mqttclient git:(master) ls build/bin
    ali  baidu  emqx  onenet
    
    ➜  mqttclient git:(master) ls build/lib
    libarch.a  libcommon.a  libmbedtls.a  libmqtt.a  libmqttclient.a  libnetwork.a  libplatform.a  libsalof.a  libwrapper.a
    

    我们直接运行./build/bin/onenet这个可执行文件:

    ➜  mqttclient git:(master) ✗ ./build/bin/onenet 
    
    welcome to mqttclient test...
    
    [I] >> [TS: 1590547112] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:948 mqtt_connect_with_results()... mqtt connect success...
    [I] >> [TS: 1590547113] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:16 default_msg_handler()...
    topic: temp_hum, qos: 0, 
    message:welcome to mqttclient, this is a publish test, a rand number: 1804289383 ...
    [I] >> [TS: 1590547116] /home/jiejie/github/mqttclient/mqttclient/mqttclient.c:16 default_msg_handler()...
    topic: temp_hum, qos: 0, 
    message:welcome to mqttclient, this is a publish test, a rand number: 1837236902 ...
    

    此时表示已经连接上OneNet云了,并且实现了数据的收发。

    代码

    那么这个测试的例程代码如下,位于./test/onenet/test.c

    /*
     * @Author: jiejie
     * @Github: https://github.com/jiejieTop
     * @Date: 2020-04-18 12:37:34
     * @LastEditTime: 2020-06-08 20:32:33
     * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
     */
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include "mqttclient.h"
    
    extern const char *test_ca_get();
    
    
    static void interceptor_handler(void* client, message_data_t* msg)
    {
        (void) client;
        MQTT_LOG_I("-----------------------------------------------------------------------------------");
        MQTT_LOG_I("%s:%d %s()...\ntopic: %s\nmessage:%s", __FILE__, __LINE__, __FUNCTION__, msg->topic_name, (char*)msg->message->payload);
        MQTT_LOG_I("-----------------------------------------------------------------------------------");
    }
    
    void *mqtt_publish_thread(void *arg)
    {
        mqtt_client_t *client = (mqtt_client_t *)arg;
    
        char buf[100] = { 0 };
        mqtt_message_t msg;
        memset(&msg, 0, sizeof(msg));
        sprintf(buf, "welcome to mqttclient, this is a publish test...");
        
        msg.qos = 0;
        msg.payload = (void *) buf;
        while(1) {
            sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
            mqtt_publish(client, "topic1", &msg);
            sleep(4);
        }
    }
    
    int main(void)
    {
        int res;
        pthread_t thread1;
        mqtt_client_t *client = NULL;
        
        printf("\nwelcome to mqttclient test...\n");
    
        mqtt_log_init();
    
        client = mqtt_lease();
    
        mqtt_set_port(client, "6002");
        mqtt_set_host(client, "183.230.40.39");
        mqtt_set_client_id(client, "599908192");
        mqtt_set_user_name(client, "348547");
        mqtt_set_password(client, "mqttclienttest1");
        mqtt_set_clean_session(client, 1);
        
        mqtt_connect(client);
        
        mqtt_subscribe(client, "topic1", QOS0, NULL);
    
        mqtt_set_interceptor_handler(client, interceptor_handler);     // set interceptor handler
        
        res = pthread_create(&thread1, NULL, mqtt_publish_thread, client);
        if(res != 0) {
            MQTT_LOG_E("create mqtt publish thread fail");
            exit(res);
        }
    
        while (1) {
            sleep(100);
        }
    }
    

    使用到的API

    • 申请一个MQTT客户端

      mqtt_client_t *client = NULL;
      client = mqtt_lease();
      
    • mqtt客户端配置,主要是配置mqtt_client_t结构的相关信息,如果没有指定初始化参数,则系统会提供默认的参数。但连接部分的参数则必须指定,比如连接的端口号、云服务器的地址或者域名、用户名、密码,这些信息都是百度云平台得到的。

      mqtt_set_port(client, "6002");
      mqtt_set_host(client, "183.230.40.39");
      mqtt_set_client_id(client, "599908192");
      mqtt_set_user_name(client, "348547");
      mqtt_set_password(client, "mqttclienttest1");
      mqtt_set_clean_session(client, 1);
      
    • 连接服务器并建立mqtt会话。

      mqtt_connect(&client);
      
    • 订阅主题,字符串类型的主题(支持通配符"#" “+”),主题的服务质量,以及收到报文的回调处理函数,如不指定则有默认处理函数,订阅主题的处理方式是异步处理的,此处设置为NULL则表示使用默认的回调处理函数。

      mqtt_subscribe(client, "topic1", QOS0, NULL);
      
    • 创建一个发布主题的线程,并且发布主题数据,指定字符串类型的主题(支持通配符),要发布的消息(包括服务质量消息主体)。

      mqtt_message_t msg;
      msg.payload = (void *) buf;
      msg.qos = 0;
      
      mqtt_publish(&client, "topic1", &msg);
      
    • 由于onenet的设备会自动订阅系统主题,而用户是不能直接订阅的,比如我们在线调试的时候,他会下发一些系统主题,那么我们需要接收这些主题,就需要设置拦截器的处理函数,去拦截它们并且通过回调函数上报到应用层,设置如下:

      mqtt_set_interceptor_handler(&client, interceptor_handler); 
      

    我们在设备列表页面,点击下方命令,下发一些数据到开发板上:

    mqtt-onenet013

    mqtt-onenet014

    mqtt-onenet015

    在开发板上可以看到这些数据内容,可以看到他的主题是$creq/开头的,而且接下来的内容应该是经过平台加密生成的,是随机的,我们也无法主动去订阅,只能通过拦截器去接收这些数据内容。

    [I] >> [TS: 1590548249] -----------------------------------------------------------------------------------
    [I] >> [TS: 1590548249] /home/jiejie/github/mqttclient/test/onenet/test.c:26 interceptor_handler()...
    topic: $creq/f6132232-bbcd-5b1e-9b9a-806da959ce80
    message:hello world !
    [I] >> [TS: 1590548249] -----------------------------------------------------------------------------------
    
    [I] >> [TS: 1590548023] -----------------------------------------------------------------------------------
    [I] >> [TS: 1590548023] /home/jiejie/github/mqttclient/test/onenet/test.c:24 interceptor_handler()...
    topic: $creq/5d2670bb-a9a4-5bc9-93d5-107246135af8
    message:hello world !
    [I] >> [TS: 1590548023] -----------------------------------------------------------------------------------
    
    展开全文
  • 文章见:RT-thread学习记录004-使用RT-thread studio 和ESP8266 连接onenet云平台https://blog.csdn.net/weixin_41976851/article/details/114962222
  • 为了实现对山体滑坡的监测和预警,保障民众生命安全和财产安全,设计了一种基于OneNET云平台的山体滑坡监测预警系统。利用MSP430G2553作为采集点电路控制芯片,控制土壤湿度、山体倾角及山体动量等传感器采集数据,...
  • 基于OneNET云平台空气智能净化解决的方案.ppt
  • onenet云平台使用The other day I was listening to the latest Shop Talk Show podcast while out for my morning run. They had Jen Simmons on the show, talking about (among other things) the standards ...
    onenet云平台使用

    onenet云平台使用

    The other day I was listening to the latest Shop Talk Show podcast while out for my morning run. They had Jen Simmons on the show, talking about (among other things) the standards process. It’s a great conversation, as you would expect—Jen’s super smart and has been doing great, meaningful work for a long time.

    前几天,我在早上跑步时收听最新的Shop Talk Show播客 。 他们让Jen Simmons参加了展览,讨论了标准流程。 正如您所期望的那样,这是一次很棒的对话,Jen超级聪明,并且长期以来一直在做伟大而有意义的工作。

    Among the things that she discussed is the care that has to go into new browser features because once shipped, it’s there for good. Most of us don’t have to worry about things to that same level because:

    她讨论过的事情之一就是必须对新的浏览器功能进行维护,因为一旦交付,它就永远存在。 我们大多数人都不必担心相同水平的事情,因为:

    …you can always delete all your code later. You can always say, ‘Oh, this thing I shipped quickly for my project, that was a bad idea. Let’s obliterate it and re-do it better later.’ But with the web, there’s two things. One, we don’t get to change it and ship it again later, almost ever. If we hurry up and we ship subgrid, and subgrid is crappy, there’s no, like, fixing it. We’re stuck with it.

    …您以后总是可以删除所有代码。 您总是可以说:“哦,我为我的项目Swift发货了,这是一个坏主意。 让我们消除它,然后再做得更好。” 但是有了网络,有两件事。 第一,我们几乎不需要更改它,而以后再重新发送。 如果我们抓紧时间并运送subgrid,并且subgrid太烂了,就没有办法修复它了。 我们坚持下去。

    This permanence to the web has always been one of the web’s characteristics that astounds me the most. It’s why you can load up sites today on a Newton, and they’ll just work. That’s in such sharp contrast to, well, everything I can think of. Devices aren’t built like that. Products in general, digital or otherwise, are rarely built like that. Native platforms aren’t built like that. That commitment to not breaking what has been created is simply incredible.

    网络的持久性一直是令我最震惊的网络特征之一。 这就是为什么您今天可以在Newton上加载网站,并且它们可以正常运行的原因 。 这与我能想到的一切形成了鲜明的对比。 设备不是那样构建的。 一般而言,数字产品或其他产品很少像这样构建。 本机平台不是那样构建的。 不破坏已创建内容的承诺简直令人难以置信。

    Jen’s other point, too, is an important one to remember:

    詹(Jen)的另一点也是要记住的重要一点:

    …And the other thing is that we’re not solving for one website. We’re not solving for facebook.com, or youtube.com, or codepen.io or for…whatever. We’re solving for the entire web and every use case ever all at the same time.

    …另一件事是我们没有解决一个网站的问题。 我们不为facebook.com,youtube.com,codepen.io或任何其他方式解决问题。 我们正在同时解决整个网络和所有用例。

    She gives an example, later on, discussing how even something seemingly simple, underlines, becomes so much more intense when you need to solve for everyone:

    随后,她提供了一个示例,讨论了当您需要为每个人解决时,看似简单的下划线如何变得如此强烈:

    Well, what about these languages that are typeset vertically? What is the typography in Japan? What’s needed for this kind of script that is completely different than the Latin alphabet? And there’s a long conversation about that and then, ‘Wow, we’re shipping something that actually works for all the languages and all the scripts around the world.’ Or it almost does and there’s a few pieces missing but we’re dedicated to going ahead and finishing those pieces as soon as we can.

    那么,这些垂直排版的语言呢? 日本的版式是什么? 这种与拉丁字母完全不同的脚本需要什么? 对此进行了漫长的讨论,然后,“哇,我们正在交付一种实际上适用于世界上所有语言和所有脚本的东西。” 或几乎可以做到,并且缺少一些内容,但是我们致力于尽快完成并完成这些内容。

    There’s a lot of thought and consideration that goes into deciding what makes its way into this incredible platform and what doesn’t.

    在决定什么因素进入这个令人难以置信的平台时,有很多想法和考虑。

    Another person I have a ton of respect for and who has been doing incredibly important work for a long time is Alex Russell. In particular, he’s put an absurd amount of time and energy into advocating for being careful about the overreliance on JavaScript that is leading to much of the web’s current performance issues.

    我一直很敬重并且做了不可思议的重要工作的另一个人是Alex Russell 。 特别是,他花费大量的时间和精力来提倡谨慎对待对JavaScript的过度依赖,而JavaScript过度依赖导致许多当前的Web性能问题。

    I thought about Jen’s comments when I saw one person stating that Alex was trying to “sell you on fairy tales of Use the Platform”.

    当我看到有人指出亚历克斯(Alex)试图“向您出售使用平台的童话”时,我想到了詹的评论。

    I don’t want to single that person out because I’m not here to encourage a pile-on, but also because they’re hardly the first person to express that general sentiment. But, that statement about the “fairy tale of Use the Platform” has really stuck with me, because it feels…wrong.

    我不想单挑那个人,因为我不是在这里鼓励积累意见,还因为他们几乎不是第一个表达这种总体观点的人。 但是,关于“使用平台的童话”的说法确实困扰我,因为感觉……是错误的。

    So much care and planning has gone into creating the web platform, to ensure that even as new features are added, they’re added in a way that doesn’t break the web for anyone using an older device or browser. Can you say the same for any framework out there? I don’t mean that to be perceived as throwing shade (as the kids say). Building the actual web platform requires a deeper level of commitment to these sorts of things out of necessity.

    为了创建Web平台,已经进行了很多工作和计划​​,以确保即使添加了新功能,对于使用旧设备或浏览器的人来说,添加新功能的方式也不会破坏网络。 您可以针对任何框架说同样的话吗? 我的意思并不是要被当作投掷阴影(就像孩子们说的那样)。 构建实际的Web平台需要承担这些事情出于需要更深层次的。

    And as some frameworks are, just now, considering how they scale and grow to different geographies with different constraints and languages, the web platform has been building with that in mind for years. The standards process feels so difficult to many of us because of the incredible amount of minutiae that becomes critical. That security issue that might maybe be a problem? Maybe you feel comfortable taking that risk but when you’re creating something that everyone, everywhere is going to use, it becomes a valid reason for not shipping.

    而且,就目前而言,考虑到某些框架如何扩展并发展到具有不同限制和语言的不同地理位置,Web平台多年来一直在考虑这一点。 对我们许多人来说,标准流程感到如此困难,因为大量的细节变得至关重要。 该安全问题可能是个问题? 也许您会冒险冒这个险,但是当您创建所有人都可以使用的东西时,这便成为不发货的正当理由。

    People talk a lot about the web being accessible or performant by default, and while it’s not perfect, it’s also not that far from being true. Creating the platform means you have to prioritize these things.

    人们经常谈论默认情况下可访问或性能良好的Web,虽然它并不完美,但也离真实不远。 创建平台意味着您必须优先考虑这些事情。

    If you care at all about reaching people outside of the little bubbles we all live in, using the platform can’t be a fairy tale: it has to be the foundation for everything that we build.

    如果您根本不在乎与我们所有人生活中的小气泡接触,那么使用该平台绝不是童话故事:它必须是我们构建的一切的基础。

    That doesn’t mean that foundation is enough, or always right.

    这并不意味着基础就足够,或者永远都是正确的。

    Are there limitations? Absolutely! There’s a reason why we still have a standards body, 26 years or so after HTML was first specified: because the work isn’t done and never (knock on wood) will be. (It’s also why I find it very encouraging that folks like Nicole Sullivan are hard at work to identifying some of the things we need frameworks for that should probably be in the browser instead.)

    有限制吗? 绝对! 有一个原因为什么我们仍然有一个标准机构,在第一次指定HTML后约26年:因为这项工作还没有完成,也永远不会(敲敲木头)。 (这也是为什么我感到鼓舞的是,像Nicole Sullivan这样的人正在努力确定我们需要的某些框架,这些框架可能应该在浏览器中。)

    The web thrives on a healthy tension between stability and the chaos of experimentation. It’s perfectly fine, and necessary at times, to use tools to augment issues and limitations we may have on the web. I have no problem with that at all.

    在稳定性和实验混乱之间,健康的张力使网络蓬勃发展。 使用工具来增加我们在网络上可能存在的问题和局限性是非常好的,而且有时是必要的。 我一点都没有问题。

    But it’s important that we do so very carefully because there are definite trade-offs.

    但是重要的是,我们必须谨慎行事,因为存在一定的取舍。

    To create the standards that make it into the platform, careful care is given to each and every feature to minimize the security risks. Every new feature has to be carefully considered from an accessibility perspective to make sure that not only does it not cause harm, but that assistive technology has all the information it needs to be able to provide people with a usable experience. Performance has to be top of mind for each new standard, to ensure that shipping it won’t cause undue bloat or other performance issues.

    为了创建将其纳入平台的标准,我们会仔细注意每个功能,以最大程度地降低安全风险。 从可访问性的角度出发,必须仔细考虑每个新功能,以确保它不仅不会造成伤害,而且确保辅助技术具有所需的所有信息,以便能够为人们提供可用的体验。 对于每个新标准,性能都必须放在首位,以确保发布时不会引起过大的膨胀或其他性能问题。

    And each of these things must not be considered simply in one single context, but for all sites and across geographies, languages, devices, and browsing clients.

    而且,这些事情中的每一项都不能仅仅在一个单一的上下文中加以考虑,而应针对所有站点以及跨地域,语言,设备和浏览客户端。

    Can you say, with confidence, that the same level of care is given in the tools and frameworks we use or build?

    您能否满怀信心地说,我们使用或构建的工具和框架给予了同等的关注?

    Use the platform until you can’t, then augment what’s missing. And when you augment, do so with care because the responsibility of ensuring the security, accessibility, and performance that the platform tries to give you by default now falls entirely on you.

    除非无法使用,否则请使用该平台,然后增加缺少的内容。 而且,当您进行扩充时,请务必谨慎,因为确保平台默认为您提供的安全性,可访问性和性能的责任现在完全落在了您身上。

    翻译自: https://timkadlec.com/remembers/2019-10-21-using-the-platform/

    onenet云平台使用

    展开全文
  • 针对空调耗电量大,因管理不善人为存在浪费的问题,文中提出并实现了一种基于OneNET云平台,通过增加外置智能空调控制终端模块对温湿度进行实时监控、对普通空调进行远程控制的系统.整个系统分为手机APP客户端、云上...
  • 终端设备上报数据到OneNET云平台,除了云平台可以提供的可视化web页面外,还可以通过定制数据管理工具的方式对云数据进行展示。在该版本中提供对最细粒度的数据样本展示。基于最细粒度的基础上,可针对客户提供定制...
  • 基于ONENET云平台计步器设计## 标题 控制器:STM32F103C8T6 加速度传感器:ADXL345 WIFI模块:esp8266-01 显示屏:0.96OLED 上位机:LabVIEW
  • OneNET云平台 配置虚拟机网络 1、linux虚拟机连接外网的配置方法,配置linux虚拟机能连接外网 1)、虚拟机配置成桥接模式 2)、linux 虚拟机ip设置,配置网关、DNS等,需重启虚拟机让配置生效 配置网络 3)、检查ip...
  • 树莓派上传数据到onenet云平台

    千次阅读 2019-05-16 14:37:03
    背景:通过树莓派上传数据到onenet云平台 操作:看代码 # -*- coding:utf-8 -*- # File: cputemp.py #向平台已经创建的数据流发送数据点 import urllib2 import json import time import datetime APIKEY = '...
  • 本次项目设计的是厨房安全监控系统,基于ESP8266WiFi模块进行数据发送,利用Arduino开发板集成ESP8266模块,采集传感器检测的数据,然后用WiFi发送到指定的OneNet云平台的设备地址,使用Python的Flask框架对接云平台...
  • ESP8266连接OneNet云平台的方法

    万次阅读 多人点赞 2019-04-25 10:57:41
    图1 ESP8266引脚图 图2.2 ESP8266实物图 图2.2 ESP8266实物图 1.如何接线? VCC/CH_PD 接3.3V的电压。(朋友说CH_PD 不用接,但我...配置OneNet端,步骤如下: 进入OneNet的开发者中心,如上图,点击“添加产品”...
  • 【树莓派】树莓派+DHT11+onenet云平台

    千次阅读 2019-05-12 17:46:51
    二、onenet云平台配置 1、进入官网,点击开发者中心 2、添加产品 3、点击上一步创建的产品,进入界面如下,记录Mastr-APIkey(后面会用到) 4、添加设备,记录设备ID(后面会用到) 5、添加数据....
  • IOT_SHT20_STM32_ESP8266 简单物联网程序源码,使用STM32和OneNET云平台
  • 基于OneNET云平台的环境监测系统 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的...
  • OneNet,中移物联网云平台,是由中国...实际监测环境中,平台一般是前端监测设备和后台软件产品的一个桥梁,现场设备数据通过RTU(数据传输单元)并以平台可以接受的MQTT协议,上传到OneNet云平台;后台软件可以在...
  • 在学习利用OneNET云平台的过程中,使用MQTT客户端——MQTT.fx来。设备将当前所处的状态作为MQTT主题发送给IoT Hub,每个MQTT主题topic具有不同等级的名称,如“小区/区域/车位闲置” 。MQTT代理服务器将接收到的主题...
  • 在一次偶然的机会中遇到了中国移动的OneNET云平台,在使用了段时间后发现OneNET做的真心不错,功能多,界面也简洁简单,操作起来很方便,特别是OneNET的技术支持也很给力!!那么回归正题,中国移动物联网开放平台是...
  • 文章目录前言一、硬件连接二、树莓派开启I2C功能1、使能I2C Kernel Module2、安装I2C-Tools三、本地温度显示1、安装luma.oled的包2、点亮oled屏幕3、本地温湿度检测四、ONENET云平台显示温湿度数据1、设置onenet云...
  • 在学习使用OneNET云平台过程中,使用MQTT协议向平台上传数据,利用MQTT.fx输入发布tpoic,为了确保设备上传消息确实被平台所接受处理,设备可以订阅系统 topic ,从而获取上传数据点的结果消息 具体详情可参见OneNET...
  • 1、wifi的sid修改 #define ESP8266_WIFI_INFO "AT+CWJAP=\"swiphone\",\"19991117\"\r\n" #define ESP8266_ONENET_INFO "AT...2、183.230.40.39和876是onenet云平台的服务器地址和端口号。 2、初始化 Hardware_Init()
  • 官方文档参考 协议文档(在旧版里面) 用网络串口助手向平台发数据 onenet平台地址 JSON格式串识别 最终效果:
  • ESPlorer + LUA ...首先在中移OneNET云平台有产品及设备,需要有(产品ID,设备ID,鉴权信息,API-KEY); OneNET的服务器IP: 183.230.40.39;port: 6002 NodeMCU开发板及下载线; 二. 先连网 wifi.setmode...
  • 二、通过串口助手,使用AT指令连接到OneNET云平台 AT//测试模块是否能正常通讯,返回"ok"即为正常 AT+CWMODE=//配置成 STA模式 AT+RST//重启生效 AT+CWJAP=“wifi的名称”,“wifi的密码” AT+CIPSTART=“TCP”,“183...
  • RT-thread学习记录004-使用RT-thread studio 和ESP8266 WIFI模块连接中国移动onenet云平台(MQTT旧版) 项目场景: 基于潘多拉开发板和ESP8266 WiFi模块连接中国移动物联网平台。为了更加直观快捷的配置软件工具包和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 394
精华内容 157
关键字:

onenet云平台