精华内容
下载资源
问答
  • [Python] 纯文本查看 复制代码# _*_ encoding:utf-8 _*_# a tool to generate vcard and parse vcard#import vobjectimport requestsfrom bs4 import BeautifulSoupimport re#create a vcard ---testdef create_...

    [Python] 纯文本查看 复制代码# _*_ encoding:utf-8 _*_

    # a tool to generate vcard and parse vcard

    #

    import vobject

    import requests

    from bs4 import BeautifulSoup

    import re

    #create a vcard ---test

    def create_vcard(phones):

    for phone in phones:

    j = vobject.vCard()

    j.add('fn')

    j.fn.value = phone

    j.add('tel')

    j.tel.type_param = 'CELL'

    j.tel.value = phones[phone]

    j.prettyPrint()

    with open('test.vcf','a') as f:

    f.write(j.serialize())

    def search_zone():

    phones = []

    url = 'http://www.jihaoba.com/haoduan/184/beijing.htm'

    reponse = requests.get(url)

    soup = BeautifulSoup(reponse.text,'lxml')

    phone_list = soup.find_all('li','hd-city01')

    pattern = re.compile('\d{7}')

    for phone in phone_list:

    if re.search(pattern, phone.string):

    phones.append(phone.string)

    print('find zone : %d'%len(phones))

    return phones

    def genrate_phone():

    final_phones = {}

    phones = search_zone()

    for zone in phones:

    for i in range(1,10):

    final_phone = zone+str(i)+"322"

    final_phones[str(zone)+str(i)] = final_phone

    return final_phones

    if __name__ == "__main__":

    print('hello world !!')

    phones = genrate_phone()

    create_vcard(phones)

    print('length%d\t'%len(phones))

    展开全文
  • 利用手机基站获取位置

    万次阅读 2016-12-19 16:57:45
    正好项目中遇到了手机基站的一些原理,那今天就在这里分享一下,现在穿戴设备这么发达,如果能有效地利用,说不定能对孩子及时的寻找,起到帮助,同时也是一大商机不是。什么是基站:简单的说就是我们打电话能连接的...

    前一段时间,看到一个新闻,竟然光天化日,朗朗乾坤下,居然有人抢孩子,以前是拐卖,现在就开始明抢了!好可怕….

    正好项目中遇到了手机基站的一些原理,那今天就在这里分享一下,现在穿戴设备这么发达,如果能有效地利用,说不定能对孩子及时的寻找,起到帮助,同时也是一大商机不是。

    什么是基站:简单的说就是我们打电话能连接的信号塔,现在覆盖范围城市里基本达到了一个小区就有一个了。

    那么也就是说,你跟踪的范围就是一个小区的范围之内了。

    需要工具:能插手机卡的设备(小手机就可以),手机卡(能发信息)

    我的实现方式:利用获得的基站信息,根据设定的合适时间发送消息给特定的人(不直接再设备上定位,因为可能没网络,当然有了你的基站位置,警察叔叔的系统很快的分析出你的位置,根据你的基站,分析出嫌疑人使用的基站,还能进行监听…)

    那么先来看看效果:

    电信手机展示效果
    这里写图片描述

    联通、移动展示效果

    这里写图片描述

    发送消息:
    这里写图片描述

    接受消息:

    这里写图片描述

    当然要还要知道各大运营商代码:

    46000 中国移动 (GSM)
    
    46001 中国联通 (GSM)
    
    46002 中国移动 (TD-S)
    
    46003 中国电信(CDMA)
    
    46004 空(似乎是专门用来做测试的)
    
    46005 中国电信 (CDMA)
    
    46006 中国联通 (WCDMA)
    
    46007 中国移动 (TD-S)
    
    46008
    
    46009
    
    46010
    
    46011 中国电信 (FDD-LTE)
    

    到这里准备工作完成,开始代码:

    一、首先获得运营商:

    得到TelephonyManager

    tm = (TelephonyManager) UIUtils.getContext().getSystemService(Context.TELEPHONY_SERVICE);
    

    使用它的getNetworkOperatorName方法

     tvOperator.setText(PhoneInfo.getTelephonyManager().getNetworkOperatorName());
    

    二、获得网络:

    package cn.hnshangyu.basestationdemo.utils;
    
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.telephony.TelephonyManager;
    
    /**
     * 获取网络连接的工具类
     */
    public class IntenetUtil {
    
        //没有网络连接
        public static final String NETWORN_NONE = "NONE";
        //wifi连接
        public static final String NETWORN_WIFI = "WIFI";
        //手机网络数据连接类型
        public static final String NETWORN_MOBILE = "MOBILE";
    
        /**
         * 获取当前网络连接类型
         *
         * @param context
         * @return
         */
        public static String getNetworkState(Context context) {
            //获取系统的网络服务
            ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
            //如果当前没有网络
            if (null == connManager)
                return NETWORN_NONE;
    
            //获取当前网络类型,如果为空,返回无网络
            NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo();
            if (activeNetInfo == null || !activeNetInfo.isAvailable()) {
                return NETWORN_NONE;
            }
    
            // 判断是不是连接的是不是wifi
            NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (null != wifiInfo) {
                NetworkInfo.State state = wifiInfo.getState();
                if (null != state)
                    if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
                        return NETWORN_WIFI;
                    }
            }
    
            // 如果不是wifi,则判断当前连接的是运营商的哪种网络2g、3g、4g等
            NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    
            if (null != networkInfo) {
                NetworkInfo.State state = networkInfo.getState();
                String strSubTypeName = networkInfo.getSubtypeName();
                if (null != state)
                    if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
                        switch (activeNetInfo.getSubtype()) {
                            //如果是2g类型
                            case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
                                return "GPRS";
                            case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
                                return "CDMA";
                            case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
                                return "EDGE";
                            case TelephonyManager.NETWORK_TYPE_1xRTT:
                                return "1xRTT";
                            case TelephonyManager.NETWORK_TYPE_IDEN:
                                return "IDEN";
                            //如果是3g类型
                            case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
                                return "EVDO_A";
                            case TelephonyManager.NETWORK_TYPE_UMTS:
                                return "UMTS";
                            case TelephonyManager.NETWORK_TYPE_EVDO_0:
                                return "EVDO_0";
                            case TelephonyManager.NETWORK_TYPE_HSDPA:
                                return "HSDPA";
                            case TelephonyManager.NETWORK_TYPE_HSUPA:
                                return "HSUPA";
                            case TelephonyManager.NETWORK_TYPE_HSPA:
                                return "HSPA";
                            case TelephonyManager.NETWORK_TYPE_EVDO_B:
                                return "EVDO_B";
                            case TelephonyManager.NETWORK_TYPE_EHRPD:
                                return "EHRPD";
                            case TelephonyManager.NETWORK_TYPE_HSPAP:
                                return "IDEN";
                            //如果是4g类型
                            case TelephonyManager.NETWORK_TYPE_LTE:
                                return "LTE";
                            default:
                                //中国移动 联通 电信 三种3G制式
                                if (strSubTypeName.equalsIgnoreCase("TD-SCDMA")) {
                                    return "TD-SCDMA";
                                } else if (strSubTypeName.equalsIgnoreCase("WCDMA")) {
                                    return "WCDMA";
                                } else if (strSubTypeName.equalsIgnoreCase("CDMA2000")) {
                                    return "CDMA2000";
                                } else {
                                    return NETWORN_MOBILE;
                                }
                        }
                    }
            }
            return NETWORN_NONE;
        }
    }
    
    
    tvNetwork.setText(IntenetUtil.getNetworkState(this));
    

    三、获取460代码:

    tm = (TelephonyManager) UIUtils.getContext().getSystemService(Context.TELEPHONY_SERVICE);
    
    networkOperator = PhoneInfo.getTelephonyManager().getNetworkOperator();
    
    if (networkOperator.startsWith("46000") || networkOperator.startsWith("46002")) {
                //"中国移动";
                showDatasMoeAndLink();
                type = 1;
            } else if (networkOperator.startsWith("46001")) {
                //"中国联通";
                showDatasMoeAndLink();
                type = 1;
            } else if (networkOperator.startsWith("46003") || networkOperator.startsWith("46011")) {//46003电信3G ,46011电信4G
                //"中国电信";
                showDatasTelecom();
                type = 2;
            }
    

    四、获得中国移动和联通的基站信息

      /**
         * 如果是中国移动和联通
         */
        private void showDatasMoeAndLink() {
            llLacd.setVisibility(View.VISIBLE);
            llLach.setVisibility(View.VISIBLE);
            llSidd.setVisibility(View.GONE);
            llSidh.setVisibility(View.GONE);
            gcl = (GsmCellLocation) PhoneInfo.getTelephonyManager().getCellLocation();
            lac = gcl.getLac();
            cid = gcl.getCid();
            tvLacd.setText(String.valueOf(lac));
            tvLach.setText(Integer.toHexString(lac));
            tvCid.setText(String.valueOf(cid));
            tvCih.setText(Integer.toHexString(cid));
    //        mhandler.sendEmptyMessageDelayed(88, 10 * 1000);
        }
    

    五、获得中国电信的基站信息

        /**
         * 如果是中国电信
         */
        private void showDatasTelecom() {
            llLacd.setVisibility(View.GONE);
            llLach.setVisibility(View.GONE);
            llSidd.setVisibility(View.VISIBLE);
            llSidh.setVisibility(View.VISIBLE);
            ccl = (CdmaCellLocation) PhoneInfo.getTelephonyManager().getCellLocation();
            sid = ccl.getSystemId();
            nid = ccl.getNetworkId();
            bid = ccl.getBaseStationId();
    
            tvSidd.setText(String.valueOf(sid));
            tvSidh.setText(Integer.toHexString(sid));
            tvBidd.setText(String.valueOf(bid));
            tvBidh.setText(Integer.toHexString(bid));
            tvNidd.setText(String.valueOf(nid));
            tvNidh.setText(Integer.toHexString(nid));
    //        mhandler.sendEmptyMessageDelayed(88, 10 * 1000);
        }
    

    六、发信息:

      private void sendSms() {
            smsManager = SmsManager.getDefault();
            if (type == 1) {//是中国移动和联通
                smsManager.sendTextMessage("187****8566", null, "mcc=" + mcc + ",mnc=" + mnc + ",lac=" + lac +
                        ",cid=" + cid, null, null);
            } else if (type == 2) {//是中国电信
                smsManager.sendTextMessage("187****8566", null, "mcc=" + mcc + ",mnc=" + mnc + ",sid=" + sid +
                        ",nid=" + nid + ",bid=" + bid, null, null);
                Log.e("LogUtils","sendTextMessage,sendTextMessage,sendTextMessage");
            }
        }
    

    七、权限:

     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.SEND_SMS" />
    

    好了基本核心功能就是这了,当然如果需要直接定位的的可以用Google的接口,不过一般使用基站定位都用的是自己后台接口(用谷歌还不如直接用地图了,还方便….)

    有什么不足望大家指出,谢谢….

    demo下载地址:http://download.csdn.net/download/huangxiaoguo1/9715542

    展开全文
  • 直奔主题,本次练习是将STM32作为主控芯片,ESP8266作为外设,利用串口传递信息,通过机智云平台实现与手机之间的通信

    STM32通过ESP8266利用机智云平台实现手机远程操作

    将STM32作为主控芯片,ESP8266作为外设,利用串口传递信息,通过机智云平台实现STM32与手机之间的数据传输!之所以选择机智云平台,是因为机智云平台相关配套的软件工具非常齐全,而且和正点合作,按照原子哥的精神推出有详细的基于STM32的教程,非常适合对云服务的认知处于一脸懵的人对其进行初步的探索。
    其实原子哥的东西很详细,但是总得自己亲身经历一番,才知道这条路上有哪些自己没有注意的坑,同一个地方摔倒一次就好!正点原子以及其他开发板资料下载链接:开发板资料下载链接
    准备工作:
    (1)STM32板子和ESP8266模块必不可少,下载机智云的DEMO APP,链接:机智云DEMO APP
    (2)ESP8266的固件,链接:GAgent for ESP8266 04020034
    (3)串口调试工具,链接:机智云串口调试助手 for win7\win8\win10 v2.3.5
    (4)使用MCU代码自动生成工具,自动生成MCU代码,使用方法链接:MCU代码生成工具介绍
    (5)这个链接包含乐鑫官方烧录工具,机智云串口调试工具,ESP8266固件,以及原子哥详细的机智云教程的PDF资料;提取码为:txs8:工具
    步骤有四:
    (1)注册机智云,创建新产品,使用MCU代码生成工具自动生成代码;
    (2)刷ESP8266固件,并在机智云的串口助手上进行调试;
    (3)将生成的代码移植到自己的工程;
    (4)联网,调试;

    1、创建产品,生成代码

    1.1 创建产品简介

    创建产品的过程中要弄明白几个关键要素之间的关系,Product Key,Product Secret,以及数据点所包含的内容!
    首先Product Key和Product Secret可以理解为你所创建产品的登录账号和密码,后面自动生成的代码会把这个写进协议里面,这样的话后期把程序烧录进MCU入网之后,手机会通过这个获取你所创建的产品信息!
    接下来以最简单的控制LED为例!
    比如:实现的目标既可以在MCU开发板控制三个LED的亮灭,又可以在手机上控制,而且在开发板上控制时手机上可以显示当前LED的亮灭状态!那么你可以创建一个产品,然后产品里面有三个数据点!这三个数据点就是指这三个LED!然后三个LED中每一个又包含“亮”“灭”两种状态!
    这里的产品就像是用MDK写STM32点亮发光二极管的时候要建立的工程类似!然后因为三个LED有且只有两种状态所以我们设置的数据包类型为布尔值!然后我们希望手机端和开发板上都可以控制所以数据读写类型设置为可写!
    关于数据类型和读写类型解释如下图: 数据类型
    读写类型
    关于数据点的其他介绍可以点如下链接:数据点概述
    创建后的产品界面和数据点界面如下图:产品
    数据点

    1.2 MCU代码自动生成服务简介

    可以根据自己使用的开发板的不同生成对应的代码,在此生成的是通用版,生成流程如下图:
    代码生成流程
    生成的两个文件回头要移到自己创建的工程中,不需要理解具体的代码流程,只要知道4个特定的API函数,将他们像STM32封装好的库函数一样调用即可!简单介绍一下这四个函数的功能,具体的内容修改会在下文说明,详细的介绍点如下链接:移植说明
    在这里插入图片描述
    (1)void gizwitsInit (void):相关协议的初始化函数;
    (2)void gizwitsSetMode (uint8_t mode):配置入网方式函数;
    (3) void gizwitsHandle(dataPoint_t *dataPoint):对当前数据点的内容进行处理和上传;
    (4)int8_t gizwitsEventProcess(eventInfo_t info, uint8_t data, uint32_t len):事件处理函数,类似于MCU的中断函数,发生了什么事件,对应的处理相应的内容
    这部分其实就是一个准备工作,以及建立对机智云的大致的了解,了解了这四个函数的大概描述建立一个概念就行,详细的代码移植会在后面说明!

    2、刷ESP8266固件,并进行调试

    必须调试!必须调试!必须调试!重要的事情说三遍!因为烧录软件即使提示刷固件成功了,但是不清楚其他的硬件有没有问题,或者刷的固件对不对!这样刷了固件之后盲目的和单片机进行连接,后面无法通信的话就不清楚到底是程序的问题,还是硬件的问题又或者是ESP8266以及其固件的问题了!如下图原子哥的刷固件教程很详细!刷固件
    我刷的固件是从机智云的官网上下载的最新固件,下载完成之后打开之前准备的串口调试助手!
    机智云的串口调试助手有三大主要功能,分别对应不同的场景;以及附带的小工具
    (1)串口调试助手模拟MCU:
    使用场景:目前手上没有MCU或者MCU程序正在开发又或者验证ESP8266功能是否正常
    (2)串口调试助手模拟WIFI模块:
    使用场景:目前手上没有WIFI模块,或者调试MCU程序是否正常
    (3)双串口通信:
    使用场景:MCU程序正常,ESP8266功能正常,但是连接之后无法正常工作,所以用它抓取MCU和ESP8266之间的命令,帮助检查漏洞
    (4)小工具:校验与计算;生成二维码;生成Signature
    在这里我只使用了第一个功能,因为主要是为了熟悉通过ESP8266上云的流程,初步实现点亮LED就好了,所以代码比较简单,中间没出什么岔子,所以其他的功能没用到!
    言归正传:如下图,选择模拟V4MCU,当输入Product key和Product secret之后打开串口,若8266功能正常则会在打印区域打印设备信息!设备信息
    然后可以通过手机端的DEMO APP发送控制命令,在串口调试助手右边的区域会同步显示自己所建产品数据点的状态!下图1
    同样改变串口调试助手上数据点的状态也可以同步到APP端,不过在改变状态之后要记得点上报数据!下图2手机发送
    在这里插入图片描述

    3、代码移植

    如下图,原子哥的教程中将移植过程分成这样的八条,接下来将详细解释
    原子哥说明
    我们能够想到,若想建立手机端和设备端都可以控制且实现实时通信!以点亮一个LED为例,那么整个流程应该是这样的:
    (1)ESP8266要能够正常的收发数据:因为ESP8266是设备端和云端之间信息传递的桥梁;
    (2)要入网:因为就算ESP8266正常,上不了网,就像咱们手机正常,没有流量打什么王者;
    (3)信息的上下传递:我按下一个按键,LED亮了,我要把这个数据上传给云端,然后云端传给APP;同理,我在APP上更改了LED的状态,我要把这个命令通过云下发给MCU让他给LED一个电平!
    (4)实现MS定时器:和云端,手机端进行通信,肯定得需要一个时间作为基准!协议层是建立在以MS为单位的时间基础上的,所以需要用其他不用的定时器建立一个精准的MS级的定时器,不然通信会出现紊乱
    (5)日志打印,设备重启:倘若设备通过云端和手机之间的通信使用一段时间出现问题,那么我们就需要检查设备的运行日志帮助我们找到问题;而且如果更严重的话,需要控制MCU重启。
    捋清楚了上面的几步,那么我们就可以挨个实现程序的移植了!

    3.1:收发数据代码移植

    在这里,我们是将ESP8266作为一个串口设备来用!所以要初始化相应的串口,然后在接收中断函数中将通过ESP8266接收到的数据转存起来;而且也要实现将需要发送的数据通过串口发送出去!
    串口初始化函数:在这里我是将ESP8266和MCU的串口2连接的,所以初始化串口2

    void usart2_init(void)
    {
    	GPIO_InitTypeDef PA2_3;
    	USART_InitTypeDef usart2;
    	NVIC_InitTypeDef NVIC_initstructrue;
    	//使能串口和GPIO口时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    	//初始化TX端口PA2,RX端口PA3
    	PA2_3.GPIO_Pin=GPIO_Pin_2;
    	PA2_3.GPIO_Mode=GPIO_Mode_AF_PP;
    	PA2_3.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&PA2_3);
    	PA2_3.GPIO_Pin=GPIO_Pin_3;
    	PA2_3.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA,&PA2_3);
    	//初始化USART2
    	usart2.USART_BaudRate=9600;
    	usart2.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    	usart2.USART_WordLength=USART_WordLength_8b;
    	usart2.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    	usart2.USART_Parity=USART_Parity_No;
    	usart2.USART_StopBits=USART_StopBits_1;
    	USART_Init(USART2,&usart2);
    	USART_Cmd(USART2,ENABLE);
    	USART_ClearFlag(USART2,USART_FLAG_TC);
    	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
    	//初始化USART2中断
    	NVIC_initstructrue.NVIC_IRQChannel=USART2_IRQn;
    	NVIC_initstructrue.NVIC_IRQChannelPreemptionPriority=3;	
    	NVIC_initstructrue.NVIC_IRQChannelSubPriority=4;
    	NVIC_initstructrue.NVIC_IRQChannelCmd=ENABLE;
    	NVIC_Init(&NVIC_initstructrue);
    	
    }
    

    串口接收中断函数:如下文,要注意最后一句【 gizPutData(&r, 1);】这句是将
    接收到的数据存到缓冲区中!至于这个函数要执行什么,不必考虑,这是机智云代码生成工具自动生成的API,我们只要知道接受到了数据,然后调用这个函数存起来,就算接收成功!

    void USART2_IRQHandler(void)
    {
    	u8 r;
    	if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
    	{
    		
    		r=USART_ReceiveData(USART2);
    		gizPutData(&r, 1);
    		
    	}
    	
    }
    

    串口发送函数:我们知道串口发送的时候其实只要执行usart_senddata然后在while循环里等待发送完成就可以了,但是针对不同的人的不同产品,平台不同,而且就算MCU都一样,ESP8266接的端口可能也不同!所以机智云的协议层在需要发送数据的时候都是调用一个发送函数 uartWrite() 所以我们只要根据自己的设备和端口将数据发送函数写在 uartWrite() 这个函数里面就可以了!如下文编码的第二个 for循环语句,至于为什么要发送0X55,我也不清楚,有知道的麻烦留言告诉我,不胜感激!

    int32_t uartWrite(uint8_t *buf, uint32_t len)
    {
        uint32_t i = 0;
        
        if(NULL == buf)
        {
            return -1;
        }
        
        #ifdef PROTOCOL_DEBUG
        GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
        for(i=0; i<len; i++)
        {
            GIZWITS_LOG("%02x ", buf[i]);
        }
        GIZWITS_LOG("\n");
        #endif
    
        for(i=0; i<len; i++)
        {
            USART_SendData(USART2, buf[i]);//STM32 test demo
    	   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
            if(i >=2 && buf[i] == 0xFF)
            {
    					USART_SendData(USART2,0X55);
    					while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
             }
        }
    
    
        
        return len;
    }
    

    至此,串口收发数据的代码移植完成

    3.2: 实现入网

    配置入网也就是MCU给WIFI模组发送不同的命令以实现不同的功能!只是在这里我们使用它的入网功能而已!这个命令的发送是通过调用 gizwitsSetMode() 这个API函数来实现的,如下图!
    setmode
    这个是自动生成的代码,而我们要做的是在什么情况下,调用这个函数来配置WIFI模组实现相应的功能!如下图
    按键
    这是一个按键扫描程序,只要我们按下不同的按键就可以调用 gizwitsSetMode() 函数配置WIFI模组实现不同的功能!

    3.3:信息的上下传递

    在移植这个之前我们要先了解自动生成的代码里面的一个结构体,如下图
    数据点结构体
    这个结构体里面的元素就是我们当时创建的产品里面的数据点,因为我当时只创建了一个数据点,所以这里只有一个元素!在这里生成的代码自动帮我们创建了一个全局变量,如下图!
    全局变量
    当我们在设备端实现LED的亮灭时,对应的就会改变这个变量的值,然后上传到云端发给APP!这个上报的过程要调用一个API函数 userHandle(); 同理,当我们在APP端改变这个值的时候也会相应的下发给MCU,然后MCU根据这个值进行相应的动作!数据的下发需要调用gizwitsEventProcess这个API函数!
    我们只要对这两个API函数进行修改:
    userHandle(); 中检测到LED灯状态改变就改变currentDataPoint,然后上报到云端;
    gizwitsEventProcess中检测到currentDataPoint数值改变了就让MCU动作;
    代码如下图:
    数据上报:
    数据上报
    数据下发:
    数据下发
    至此,我们能够实现数据的上报和下发过程!

    3.4:MS级定时器

    实现MS级定时器,与实现串口接收一样,初始化的时候正常初始化,修改一下定时器中断函数就行了!在定时器中断函数中,触发了定时器中断的时候,调用一下 gizTimerMs(); API函数就行了,至于调用之后,协议怎么处理,我们不需要弄清楚!只要初始化的时候注意TIM_PeriodTIM_Prescaler将相应周期控制在MS级!

    void time3init()
    {
    	TIM_TimeBaseInitTypeDef time3inittype;
    	NVIC_InitTypeDef time3nvic;
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    	
    	time3inittype.TIM_Period=9;
    	time3inittype.TIM_Prescaler=7200-1;
    	time3inittype.TIM_ClockDivision=TIM_CKD_DIV1;
    	time3inittype.TIM_CounterMode=TIM_CounterMode_Up;
    	TIM_TimeBaseInit(TIM3,&time3inittype);
    	
    	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 
    	time3nvic.NVIC_IRQChannel=TIM3_IRQn;
    	time3nvic.NVIC_IRQChannelPreemptionPriority=0;
    	time3nvic.NVIC_IRQChannelSubPriority=3;
    	time3nvic.NVIC_IRQChannelCmd=ENABLE;
    	NVIC_Init(&time3nvic);
    	
    	TIM_Cmd(TIM3,ENABLE);
    	
    }
    
    void TIM3_IRQHandler(void)   
    {
    	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
    	{
    		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); 
    		gizTimerMs();
    	}
    }
    
    

    3.5:日志打印和设备重启

    日志的打印和设备的重启其实很简单!日志打印用的就是我们经常用的Printf函数,只不过机智云的协议定义了一个变量名GIZWITS_LOG代替了Printf 函数,如下图!所以他们协议调用的是GIZWITS_LOG,但是我们只要实现printf的重定向就好了!这个重定向代码网上很多,就不在赘述!
    printf
    接下来是设备重启,MCU的重启有专门的代码,我们只要复制到mcuRestart函数里面,让机智云的协议能够调用就可以了!如下图
    MCURESTART

    4、联网测试

    通过以上的步骤,基本上协议就移植成功了!然后手机端就可以控制开发板上LED灯的状态了,同时,在开发板上控制LED灯的状态也可以同步到手机端显示!如下图,点击LED测试后面的箭头会进入子页面,然后改变SWITCH的值,就可以控制LED灯了,而且在开发板上通过按键改变LED灯的状态,这里也会显示!而且在机智云的开发者中心也可以看到自己创建的产品的设备在线情况!!!至此,移植完毕!
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    展开全文
  • 久违的来记录一下最近学习的通过python代码来实现操控手机,这里是利用adb,安卓调试桥来实现的,当然也可以利用appium来实现,appium是一种自动化测试相关的,也能实现操作手机。 Android 调试桥 (adb) 是一种功能...

    久违的来记录一下最近学习的通过python代码来实现操控手机,这里是利用adb,安卓调试桥来实现的,当然也可以利用appium来实现,appium是一种自动化测试相关的,也能实现操作手机。

    Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

    • 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端。
    • 守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。
    • 服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行。

    adb是安卓的一种组件,也可以直接在安卓当中使用,通过python使用的adb的操作,打个比方,A会吃饭,要吃饭,然后B叫A用嘴巴吃饭,这样吃,然后A就这样吃饭了。这里的A就是安卓手机,B就是python脚本。

     

    想要使用adb,首先得配置好环境变量,首先先去安卓的官网下载adb的工具,地址https://developer.android.google.cn/studio/releases/platform-tools,然后存放到任意地址后,再将这个platform-tools的地址添加到环境变量中,然后在控制台窗口中输入adb,如果看到以下的情况,就说明安装完成了。

     

     

    这时候用数据线连接手机,手机根据自己的系统打开开发者模式,然后在控制台窗口中输入adb devices,然后就会出现你的设备名称

     

    利用python代码来控制也是通过系统命令来实现的,你也可以直接在电脑的控制台窗口输入adb命令,运行同样也可以对手机进行操作。

    一个点击命令:

    adb shell input touchscreen 500 500

    这句话的功能是模仿点击屏幕,在500,500的位置点击了一下。如果你输入的命令不对的话,adb也会回馈正确的命令格式或关键字,如下图

    其中的设备有平板,键盘,鼠标,手柄等等,控制方式有直接的文本,或者单个的单词,点击,滑动,后面的两个我自己自测是是用不了,可能是我没找到方法。

    因为我之前做的时候主要想实现的能够模仿人手去控制手机的那些操作,使用了之后发现弊端还是有很多,不够灵活,不能实现长按或者按住滑动之类的。但是如果说安排好固定的流程,比如一些游戏的刷金币的话,没有复杂的操作,只有单一的点击事件的话,用adb还是相当方便的,只要写好循环,持续的发送adb命令,就可以不断的的运行操作了。

     

    在python中,要使用adb的话,只需要一个os的库就可以

    也可以使用subprocess.Popen,最简单使用方式如下,设置shell=True,就不会弹出cmd框

    process = subprocess.Popen('adb shell input tap 14 1402',shell=True)

    这两种方式都是可以,我在使用后者多一些,并且是应用多线程去使用的,这时候会因为过多的创建,然后发生阻塞,这时候只要把这个服务端口kill掉就可以了。

    源码获取私信小编01哦!

     

    展开全文
  • 手机如何利用IP地址定位城市

    万次阅读 2018-02-09 16:30:54
    这个IP并不是大家通常在手机里面看到的那个地址,能看到的那个IP应该是局域网的IP,我也不是很懂,上网的IP是广域网IP吧?反正这 个IP是无法通过本机获取的(我也是问的大神才知道,网上查到的也都是获取本机的IP...
  • 频繁而又乏味的视频会议,是许多在工作中不得不承受的一种折磨。能否在视频会议时让摄像头拍到的不是频繁点头、昏睡沉沉,而是正聚精会神、一动不动听着领导讲话的自己?OBS虚拟摄像头可以实现。首先下载直播软件...
  • **第1步:**下载adb插件,以及查看手机软件包的apk应用:百度网盘下载adb连接 提取码:8gzr **第2步:**解压资源如下图(图1)所示: 图1 ** **打开platform-tools_r30.0.4-windows文件夹如下图(图2)所示: 图2 ...
  • 利用jmeter模拟手机接口测试

    千次阅读 2019-07-03 11:42:22
    利用jmeter模拟手机接口测试 (由于批量上传图片不方便,可以到博主网站查阅原版博客:https://blog.zhenglin.work/jmeter/use_jmeter_test_app.html) 本文示例是从网上找到的月光茶APP程序 首先手机操作月光茶...
  • 1用Android手机打造服务器 Android手机如今已经成为人们生活、工作必备的设备。相信如果你某天找不到手机,那么你一天的生活节奏一定会被弄的混乱不堪。  随着IT技术的不断进步,智能手机的更新换代也正在...
  • 三星手机投屏到Windows10电脑上教程投屏需要条件投屏操作步骤打开window10设置点开-系统-选到-投影到此电脑如上图设置(最好一模一样,不然会出现连不上的情况),然后退出电脑上打开你的连接应用,确认电脑是否准备...
  • // 获取手机号数据 console.log("请求接口") that.getInfor(that.mailListL) // 获取成功后调用方法传给后端 console.log("请求成功") }, function () { content="error"; },{multiple:true}); },function(e...
  • 无论是在线观看电影、视频通话、展示度假照片还是在电视上玩游戏,把你的安卓(Android)手机的屏幕内容投屏到电视机上都很简单。放过你的家人和朋友们吧,与其让他们挤在你的Android手机或平板电脑的小屏幕上前浏览...
  • 大家可能遇到过这样的情景, # 也许你是一个通过App的销售人员,需要不断...………… 那么你就可以来看看这篇帖子了。 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在
  • ①新建项目或者Module,在manifest文件中添加读取联系的权限 ②创建一个实体类,用来储存从内存中读取出来的单个的联系信息 ③自定义显示布局样式 ④自定义adapter,定义三个属性: 上下文对象Context, 数据...
  • 开心一笑【1.再逼我,再逼我就装死给你看. 2.打死我也不说,你还没使...只为逗你一笑】提出问题后端如何利用Jpush极光推送消息到手机端???解决问题Jpush极光文档官网http://docs.jiguang.cn/jpush/guideline/intro/Jp
  • python利用appium实现手机APP自动化

    万次阅读 2019-04-26 14:08:40
    下载android-sdk,这个是做android测试和开发的必备环境,(怎么下载官网都有的,利用百度工具寻找资源是一名合格IT人员的基本技能,这里不多说) 下载解压后,里面有个SDK manager.exe双击打开 双击SDK ...
  • 手里有部旧手机,不用了所以没有装手机卡,现在只能用WiFi上网。但不是所有的地方都有WiFi,只有网线的地方该怎么办呢。我记得以前的安卓智能手机是可以通过USB共享电脑宽带的,比如小米手机。上高中时我是听别人说...
  • 利用twilio进行手机短信验证

    千次阅读 2019-03-21 11:21:00
    然后 pip installtwilio ...注册完成后会在个人首页显示你的免费金额余额 和你的手机号的发信 和sid(账号) token(密钥) 添加联系手机号 按一些步骤点击 数据手机号点击call me 即可 也...
  • 开发工具与关键技术:Visual Studio 2015 正则 作者:孙水兵 撰写时间:2019年6月27 ...姓名、手机号、身份证号的HTML代码都类似。一个label标签加上一个input标签,然后在input标签下面跟上一...
  • 1.将存储在数据库中的数据布局到手机界面上,其操作请见http://blog.csdn.net/xia09222826/article/details/28660653 2.三种效果显示出的效果分别是: 1)自定义的效果 2)单选的效果 3)多选的效果 3....
  • 大周今天教你一个方法,不用担心内容重复的问题,手机就能完成操作,抓紧收藏啊。 解说短视频,利用好你的空余时间去操作,先不要想着结果会怎样,做起来,想是没用的。 一、文案 两种方法 1、自己写,适合文案功底...
  • 这也许就是传说中,程序猿的快乐吧。。。请秉着一颗平淡无奇的心阅读。。。 测试环境:拯救者Y7000P(一...这个时候,有的会选择使用Chrome浏览器的调试功能查看浏览效果,有的大佬会选择部署到服务器上查看,等等...
  • 短信验证(注册或改密码等) 首先去登录阿里大于: http://www.alidayu.com/ ...用淘宝就可以登录了,相信一般都是不需要注册的。 阿里大于搭建环境几步曲: 1、创建应用: AppKEY—设置发送参数的时候需要用到
  • 【电脑报在线】现在很多安卓4.0版本以后的手机都有了蓝牙共享网络功能,但是知道的用户并不多,真正能成功使用的也很少,其实掌握了该技巧,等于多了一个共享网络的方法,这个方法到底有何用途,实际使用中有什么...
  • 现代职场经常对自己重复的工作感到厌倦,如今的自媒体时代,很多心中都有一个在家利用电脑、手机创业做自由人的梦想,但是没有一技之长的普通其实很难通过这条途径来实现财务自由。 不过对于一些想要自在赚些...
  • 手机连接Fiddler后无法上网问题解决

    万次阅读 2019-06-19 11:38:04
    手机连接wifi是可以上网的, 但是在配置连接Fiddler抓包后,只要是配置了手动代理的IP和端口后,就死活无法联网,或者联网很慢很慢很慢。 网上试了各种配置,比如说修改注册表,设置DOWN为80;或者修改代理地址为...
  • 随着物联网的发展,工业自动化平台需要实现手机APP、网页远程监控,传统的组态软件一般只能用于局域网系统,如果需要做成手机APP和网络监控,以前是需要网络工程师配合定制,耗费时间长成本高。随着需求的增多,工控...
  • 信息化时代,现在基本上是每人都拥有一台手机,现实中,可能你会收到某个亲戚的短信或电话,来电是显示“亲人”名字,然而你仔细看看号码,这并不是你亲友手机号码,这是怎么回事呢?近日,国内知名黑客安全组织东方...
  • 手机模拟门禁卡 — 手机软件教程

    千次阅读 2021-02-24 12:08:57
    此教程教您将门禁卡、考勤卡、会员卡、停车卡、电梯卡等等各种卡片模拟进NFC手机里,从而用手机代替门禁卡 手机模拟门禁卡 — 手机软件教程 一、软硬件准备 NFC Tool 手机上的IC卡读写编辑软件,搭配蓝牙...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 224,604
精华内容 89,841
关键字:

利用手机成功的人