精华内容
下载资源
问答
  • 发送邮件。 解析手机图片获取定位信息。 改变图片格式和大小。 翻译。 查询邮编。 查询天气。 上传文件。 生产二维码。 查询图片、批量下载某度图片、某瓣图片。 练手之余,希望得到更多的建议,了解更多的...

    个人网站地址:http://106.15.198.170/:6888  超链接

    实现功能:

    1. 发送邮件。
    2. 解析手机图片获取定位信息。
    3. 改变图片格式和大小。
    4. 翻译。
    5. 查询邮编。
    6. 查询天气。
    7. 上传文件。
    8. 生产二维码。
    9. 查询图片、批量下载某度图片、某瓣图片。

    练手之余,希望得到更多的建议,了解更多的东西,不断成长。

    展开全文
  • Node.JS匿名在线聊天室纯Node.js + Js实现的在线实时聊天室。支持发送表情、本地图片,在线用户统计。
  • 叔叔不约---匿名聊天网 聊天图片爬虫抓取

    万次阅读 热门讨论 2018-02-23 20:42:21
    在一天无聊刷贴吧的时候,偶然发现了一个叫做叔叔不约的匿名聊天网站,好奇的搜索并进入,发现该网站并不需要注册便可以随机匹配聊天对象。开始我以为聊天对象均为AI,然后测试了一波,发现可能并不是AI。经过多次...

    最新跟新:由于叔叔不约规则修改,图片接口在很短时间就无法访问。404结果,本文章介绍的爬虫失效        


            在一天无聊刷贴吧的时候,偶然发现了一个叫做叔叔不约的匿名聊天网站,好奇的搜索并进入,发现该网站并不需要注册便可以随机匹配聊天对象。开始我以为聊天对象均为AI,然后测试了一波,发现可能并不是AI。经过多次测试,不同的人有不同的说话方式,不像AI作风。

        后来我发现这个网站居然可以发图片,而且图片的地址是可以获取到的,双击点击图片便跳转到了http://7xpsm9.com1.z0.glb.clouddn.com/f十二位数字?imageslim的网址上。菜鸡的我本着测试的原则,写了个爬虫来尝试直接获取自己刚才发送的图片,python代码如下:

    def pachong(num):
        try:
            url = "http://7xpsm9.com1.z0.glb.clouddn.com/f" + num + "?imageslim"
            response = requests.get(url)
            image = Image.open(BytesIO(response.content))
            if(image!=None):
                #image.save('Z:/img/'+num+'.jpg')  #windows
                image.save('/home/img/'+num+'.jpg')  #linux
        except IOError:
            print "Error: fail"
        else:
            print "yes!!!yes!!!yesss"
    

            num传递的就是自己发送图片的数字,代码大概的意思就是用get请求的方式去向服务器索要图片,如果得到了图片那么image就不会为空,则将图片保存下来。要测试的小伙伴们可以试试:1342894147847

            接下来,我又连续发了多张测试图片。发现12位数字并没有什么规律可言。最后右键保存网页,看了一波前端代码,有这么一段:

    var n = "f" + Math.round((new Date).getTime() * Math.random());
            所以图片的地址是大概由用时间戳*随机数得到的一组随机数

             于是本着更无聊的玩法,我继续写了个随机函数,随机出12位数字,给让爬虫函数不停的向服务器获取图片。  

    def suiji():
        seed = "1234567890"
        sa = []
        for i in range(12):
            sa.append(random.choice(seed))
        salt = ''.join(sa)
        print salt
        return  salt

            结果可想而知,在服务器上爬虫跑了24小时,一张图片也没有获取到。我又测试了java运行相同功能,对比了运行100次python和java的速度,java大概比python快了10% 左右。java代码如下:

    import java.io.ByteArrayOutputStream;
    import java.io.File;  
    import java.io.FileOutputStream;
    import java.io.InputStream;  
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.security.AllPermission;
    import java.util.Random;  
    public class pachong {
    
    	public static void main(String[] args) throws Exception {
    		all();
    	}
    	public static void all() throws Exception {
    		int i=0;
    		while (true) {
    			i++;
    			pachong(createData(12));
    			System.out.println(i);
    		}
    	}
    	
    	 //根据指定长度生成纯数字的随机数
        public static String createData(int length) {
            StringBuilder sb=new StringBuilder();
            Random rand=new Random();
            for(int i=0;i<length;i++)
            {
                sb.append(rand.nextInt(10));
            }
            String data=sb.toString();
            System.out.println(data);
            return data;
        }
    	
    	public static void pachong(String num) throws Exception {
    		 //new一个URL对象  
            URL url = new URL("http://7xpsm9.com1.z0.glb.clouddn.com/f"+num+"?imageslim");  
            //打开链接  
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
            //设置请求方式为"GET"  
            conn.setRequestMethod("GET");  
            //超时响应时间为5秒  
            conn.setConnectTimeout(5 * 1000);  
            //通过输入流获取图片数据  
            try {
            	InputStream inStream = conn.getInputStream(); 
            	if(inStream!=null) {
                 //得到图片的二进制数据,以二进制封装得到数据,具有通用性  
                 byte[] data = readInputStream(inStream);  
                 //new一个文件对象用来保存图片,默认保存当前工程根目录  
                 File imageFile = new File(num+".jpg");  
                 //创建输出流  
                 FileOutputStream outStream = new FileOutputStream(imageFile);  
                 //写入数据  
                 outStream.write(data);  
                 //关闭输出流  
                 outStream.close(); 
            	}
    		} catch (Exception e) {
    			System.out.println("没图");
    		}
    	}
    	
    	
    	public static byte[] readInputStream(InputStream inStream) throws Exception{  
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
            //创建一个Buffer字符串  
            byte[] buffer = new byte[1024];  
            //每次读取的字符串长度,如果为-1,代表全部读取完毕  
            int len = 0;  
            //使用一个输入流从buffer里把数据读取出来  
            while( (len=inStream.read(buffer)) != -1 ){  
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度  
                outStream.write(buffer, 0, len);  
            }  
            //关闭输入流  
            inStream.close();  
            //把outStream里的数据写入内存  
            return outStream.toByteArray();  
        }  
    
    }
    

            java和python都没有把带宽吃完,这是不能忍的,本着一条路走到底的原则,继续使用python来爬。服务器使用centos7+ 系统,其中华为云的centos7.3死活装不进去PIL,换centos7.2后安装正常。后台运行python并且保留输出结果的命令为nohup python 文件名.py &  输出会保留在nohup.out文件中,带宽吃不满没关系,在不同的路径下多运行几个爬虫就行了。使用 top 命令可以看服务器资源占用情况。如果用的是阿里云或者腾讯云可以在网页的控制台查看带宽占用,但是华为没有,那就自己装一个,安装使用如 http://www.osyunwei.com/archives/1211.html 所示。

             在本人的测试中,发现1和7开头的12位数字居多,于是采用每次加一的方式去爬图片,得到图片的速度明显比之前的随缘算法来的快。其实也就一天几张图,对叔叔不约储存图片的七牛云这样规模连续的访问并没有遭到限速之类的限制,依然能够顺利的得到图片,但是每个服务器每天的流量是却都有几个G,活脱脱像流量攻击。

             12位随机数的接口对于一般人的加密来说是足够,但是对于图片一直在增加的匿名聊天网站可能是完全不够的。我无法获取某一个人聊天的图片,但是能随机获取。在得到的图片中有很多少儿不宜的图片

            以下为漂亮小姐姐及风景系列,福利没有。真的没有



    # -*- coding: utf-8 -*-
    
    import requests
    from PIL import Image
    from io import BytesIO
    import random
    
    def pachong(num):
        try:
            url = "http://7xpsm9.com1.z0.glb.clouddn.com/f" + num + "?imageslim"
            response = requests.get(url)
            image = Image.open(BytesIO(response.content))
            #print image
            if(image!=None):
                #image.save('Z:/img/'+num+'.jpg')  #windows
                image.save('/home/img/'+num+'.jpg')  #linux
        except IOError:
            print "Error: fail"
        else:
            print "yes!!!yes!!!yesss"
    
    def suiji():
        seed = "1234567890"
        sa = []
        for i in range(12):
            sa.append(random.choice(seed))
        salt = ''.join(sa)
        print salt
        return  salt
    
    def all():
        i=0
        while(i<10):
            pachong(suiji())
    
    if __name__ == "__main__":
        all()

    展开全文
  • java发送邮件

    千次阅读 2018-10-12 13:51:14
    java发送邮件,及邮件验证码  最近在做市新闻网站的项目,有一个功能是用户忘记密码,通过邮件验证码等其他信息修改密码。不过现在的身份验证个人觉着手机验证码更加方便灵活,不过公司要求用邮箱那就用邮箱吧。 ...

    java发送邮件,及邮件验证码


           最近在做市新闻网站的项目,有一个功能是用户忘记密码,通过邮件验证码等其他信息修改密码。不过现在的身份验证个人觉着手机验证码更加方便灵活,不过公司要求用邮箱那就用邮箱吧。


    1、想要完成邮件发送功能,需要导入一个jar包--commons-email-1.4.jar。

    2、要想实现邮件发送功能,必须准备一个可以正常使用的邮箱,同时这个邮箱要开启POP3/SMTP服务。我使用的是QQ邮箱,开启POP3/SMTP服务的方法如下:

        (1)登录QQ邮箱,点击顶部--设置--账户--POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务(图片中我的pop3服务已经开启了)。

     

           

    (2)如果你的服务是关闭状态,则点击后面的开启,会弹出一个对话框。要求使用绑定的手机号发送一条短信,发送成功后,点击“我已发送”。

    (3)点击后页面弹出另一个对话框,在对话框中会有一个16位的授权码,记录下来,以后会用。

    3、导入jar,完成邮箱的服务开启后,需要编写邮件发送的方法,我使用的是springboot项目。

    public class SendMailUtil {
    
        private static final String from = "发件人邮箱";
    
        private static final String fromName = "邮件的标题";
    
        private static final String charSet = "utf-8";
    
        private static final String username = "发件人邮箱";
    
        private static final String password = "开启发件邮箱pop3服务时的授权码";
    
        private static final String subject = "邮件的主题";
    
        private static Map<String, String> hostMap = new HashMap<String, String>();
        static {
            // 126
            hostMap.put("smtp.126", "smtp.126.com");
            // qq
            hostMap.put("smtp.qq", "smtp.qq.com");
    
            // 163
            hostMap.put("smtp.163", "smtp.163.com");
    
            // sina
            hostMap.put("smtp.sina", "smtp.sina.com");
    
            // tom
            hostMap.put("smtp.tom", "smtp.tom.com");
    
            // 263
            hostMap.put("smtp.263", "smtp.263.net");
    
            // yahoo
            hostMap.put("smtp.yahoo", "smtp.mail.yahoo.com");
    
            // hotmail
            hostMap.put("smtp.hotmail", "smtp.live.com");
    
            // gmail
            hostMap.put("smtp.gmail", "smtp.gmail.com");
            hostMap.put("smtp.port.gmail", "465");
    
            // sygongzhi.com
            hostMap.put("smtp.sygongzhi", "smtp.mxhichina.com");
    
        }
    
        private static boolean validate = true;// 是否需要身份验证
    
        public static Properties getProperties() throws Exception {
            Properties p = new Properties();
            p.put("mail.smtp.host", getHost(from));
            p.put("mail.smtp.port", getSmtpPort(from));
            p.put("mail.smtp.auth", validate ? "true" : "false");
            return p;
        }
    
        public static String getHost(String email) throws Exception {
            Pattern pattern = Pattern.compile("\\w+@(\\w+)(\\.\\w+){1,2}");
            Matcher matcher = pattern.matcher(email);
            String key = "unSupportEmail";
            if (matcher.find()) {
                key = "smtp." + matcher.group(1);
            }
            if (hostMap.containsKey(key)) {
                return hostMap.get(key);
            } else {
                throw new Exception("unSupportEmail");
            }
        }
    
        public static int getSmtpPort(String email) throws Exception {
            Pattern pattern = Pattern.compile("\\w+@(\\w+)(\\.\\w+){1,2}");
            Matcher matcher = pattern.matcher(email);
            String key = "unSupportEmail";
            if (matcher.find()) {
                key = "smtp.port." + matcher.group(1);
            }
            if (hostMap.containsKey(key)) {
                return Integer.parseInt(hostMap.get(key));
            } else {
                return 25;
            }
        }
    
        /**
         * 发送普通邮件
         * 
         * @param toMailAddr
         *            收信人地址
         * @param subject
         *            email主题
         * @param message
         *            发送email信息
         */
        public static void sendCommonMail(String toMailAddr, String subject, String message) {
            HtmlEmail hemail = new HtmlEmail();
            try {
                hemail.setHostName(getHost(from));
                hemail.setSmtpPort(getSmtpPort(from));
                hemail.setCharset(charSet);
                hemail.addTo(toMailAddr);
                hemail.setFrom(from, fromName);
                hemail.setAuthentication(username, password);
                hemail.setSubject(subject);
                hemail.setMsg(message);
                hemail.send();
                System.out.println("email send true!");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("email send error!");
            }
    
        }
    
        // @SuppressWarnings("unchecked")
        public static String getAppPath(Class<?> cls) {
            // 检查用户传入的参数是否为空
            if (cls == null)
                throw new IllegalArgumentException("参数不能为空!");
            ClassLoader loader = cls.getClassLoader();
            // 获得类的全名,包括包名
            String clsName = cls.getName() + ".class";
            // 获得传入参数所在的包
            Package pack = cls.getPackage();
            String path = "";
            // 如果不是匿名包,将包名转化为路径
            if (pack != null) {
                String packName = pack.getName();
                // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库
                if (packName.startsWith("java.") || packName.startsWith("javax."))
                    throw new IllegalArgumentException("不要传送系统类!");
                // 在类的名称中,去掉包名的部分,获得类的文件名
                clsName = clsName.substring(packName.length() + 1);
                // 判定包名是否是简单包名,如果是,则直接将包名转换为路径,
                if (packName.indexOf(".") < 0)
                    path = packName + "/";
                else {// 否则按照包名的组成部分,将包名转换为路径
                    int start = 0, end = 0;
                    end = packName.indexOf(".");
                    while (end != -1) {
                        path = path + packName.substring(start, end) + "/";
                        start = end + 1;
                        end = packName.indexOf(".", start);
                    }
                    path = path + packName.substring(start) + "/";
                }
            }
            // 调用ClassLoader的getResource方法,传入包含路径信息的类文件名
            java.net.URL url = loader.getResource(path + clsName);
            // 从URL对象中获取路径信息
            String realPath = url.getPath();
            // 去掉路径信息中的协议名"file:"
            int pos = realPath.indexOf("file:");
            if (pos > -1)
                realPath = realPath.substring(pos + 5);
            // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径
            pos = realPath.indexOf(path + clsName);
            realPath = realPath.substring(0, pos - 1);
            // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名
            if (realPath.endsWith("!"))
                realPath = realPath.substring(0, realPath.lastIndexOf("/"));
            /*------------------------------------------------------------
             ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径
              中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要
              的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的
              中文及空格路径
            -------------------------------------------------------------*/
            try {
                realPath = java.net.URLDecoder.decode(realPath, "utf-8");
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            System.out.println("realPath----->" + realPath);
            return realPath;
        }
    }

    4、写一个controller,调用上面的方法。

    @Controller
    @RequestMapping(value = "/email")
    public class testSendEmail {
    
    
        @RequestMapping(value = "/sendEmail")
        @ResponseBody
        public void sendEmail(){
    
            SendMailUtil.sendCommonMail("要发送的目标邮箱","邮件主题","邮件内容");
        }
    }
    

     

    展开全文
  • 共享程序,将图片从gmail附件匿名发送到imgur 为什么? 当我想与世界分享我的照片时,我每周将这些照片发送到我的gmail帐户,下载并上传到imgur,但这很无聊,所以我想为什么我不为此创建扩展名。 您也可以发送从...
  • Node.JS匿名在线聊天室

    2021-04-05 23:19:23
    Node.JS匿名在线聊天室纯Node.js + Js实现的在线实时聊天室。 支持发送表情、本地图片,在线用户统计。
  • Node.JS匿名在线聊天室简介Node.JS匿名在线聊天室纯Node.js + Js实现的在线实时聊天室。支持发送表情、本地图片,在线用户统计。Node.JS匿名在线聊天室页面展示
  • 将数据从单片机发送到上位机(或者虚拟示波器)进行数据或图像显示,帮助我们调节一些参数,比如电机PID的调节、波形融合等,以及在我们写通信协议的时候可能遇见的问题或注意事项进行解答,本文主要以匿名上位机为...

      本文主要内容:详细介绍如何从0开始写一个数据通信,将数据从单片机发送到上位机(或者虚拟示波器)进行数据或图像显示,帮助我们调节一些参数,比如电机PID的调节、波形融合等,以及在我们写通信协议的时候可能遇见的问题或注意事项进行解答,本文主要以匿名上位机为例,新手和小白也可以实现。

    一、准备工作:

       1、要有该上位机或者虚拟示波器的通信协议或者说通信帧格式

          如本文的例子匿名上位机的通讯帧格式如下:

    图片来自匿名通讯协议v7.00
    图片来自匿名通讯协议v7.00

          再如垆边月晓开发的20通道数字示波器通讯协议:

    在这里插入图片描述

       只有知道了上位机或者虚拟示波器的通讯格式,双方才能进行通信,就像平常我们的交流一样,交流双方只有在相同语言基础上才能进行交流,再如谍战剧里面收发电报的双方按照同样的规则对数据或者说电波进行解读才能进行信息的传递。

        2、要知道你用来发送数据的单片机或者其他设备是大端模式还是小端模式。

        先介绍一下大小端模式是什么:
        大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。 这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
        小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
        简单点说,小端系统,即高位值存于高地址,低知位值存于低地址。大端系统,与小端系统相反,高位值存于低位地址,低位值存于高位地址。
        常见的单片机大小端模式:(1)KEIL C51中,变量都是大端模式的,而KEIL MDK中,变量是小端模式的。(2)SDCC-C51是小端寻址,AVRGCC 小端寻址.(3)PC小端,大部分ARM是小端 (4)总起来说51单片机一般是大端模式,32单片机一般是小端模式.
        为什么要确定发送数据的单片机的大小端模式呢,在下文中会详细介绍,大小端模式不同,数据通信的程序会有一些差异。

       3、确保你单片机的串口可以正常的发送数据

        可以让单片机通过串口发送一个简单的数据,用串口助手或者其他软件(本文的例子匿名上位机是可以查看的)查看数据是否正确,也就是保证串口可以正确的发送数据,这一步很重要,可以避免不少麻烦,比如我在写数据通信的程序的时候,上位机的数据校验一直失败,我就觉得是数据通信程序哪里写错了,不断地检查,改来改去,最后发现通讯程序是对的,问题出在串口上,我在下载程序到单片机的时候,内部振荡器的频率设置错了,除此之外波特率也是经常出错的地方。

    二、进入正题,开始写数据通讯的程序:

       1、定义一个数组用来存放准备发送的数据,因为是按字节进行发送的,所以定义为uint8 即8位无符号整型就可以了,一般来说100个容量肯定够用了
    uint8 data_to_send[100];
    
       2、根据你要发送数据的类型和个数,确定函数的参数类型和个数,下面以四个uint16型数据为例。
    void ANO_DT_Send_F1(uint16 _a, uint16 _b, uint16 _c, uint16 _d)   //F1帧  4个 uint16 参数
    
       3、根据通讯真格式将要发送的数据先存放在你定义的数组里,这一步呢我们先把DATA区之前的放到数组里。(为了阅读方便,我把本文例子匿名上位机的灵活通讯帧格式在下面再放一次)

    图片来自匿名通讯协议v7.00

        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
        data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0XFF;
        data_to_send[_cnt++] = 0XF1;
        data_to_send[_cnt++] = 8; //DATA区数据长度
    
       解释一下, _cnt是用来确定当前数据存放在数组的位置,sumcheck和addcheck分别是和校验和附加校验,这三个量都要初始化为0。i是下文进行校验时用到的循环变量。
        按照本例中的通讯帧格式,我们首先要发送0xAA,把它放在我们设定的数组 data_to_send【0】中,此时_cnt加1变为1,为存放下一个数据做准备,接着把要发送的 0XFF和0XF1(当然本例用的是F1帧,匿名上位机共F1到FA共十个用户帧供我们选择)放在数组的data_to_send【1】、data_to_send 【2】中,
        接下来要存放的就是DATA区的数据长度了,以字节为单位,比如uint8或者int8是一个字节的, uint16或者int16是两个字节的,uint32或者int32是四个字节的。本例的匿名上位机v7.00暂不支持float型数据,可以吧你要发的float型数据乘以10、100、1000…等转化成整数,用uint32或者int32进行传输,本例中我们发送的是四个int16型数据,即2+2+2+2=8,就将8放在data_to_send【3】中。
       4、对数据拆分的介绍(在此步中介绍为啥要确定你所用的单片机是小端模式还是大端模式)
        一般呢我们用串口传输数据都是按字节传输的,你买的单片机带的串口发送库函数一般也是按字节进行发送的,我们知道uint8或者int8是一个字节的,就可以直接把数据按顺序从data_to_send【4】开始放在数组里,那么对于uint16、int16、uint32、int32这种多字节的数据就得进行数据拆分,比如uint16、int16拆成两个uint8、int8类型的数。同理uint32、int32拆成四个。大多数的数据通信采用了一下拆分方法。
    #define BYTE0(dwTemp) (*(char *)(&dwTemp))
    #define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1))
    #define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
    #define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
    
        大致的处理过程是 对变量 dwTemp 去地址,然后将其强制转化成char类型的指针 最后再取出指针所指向的内容,这样就完成了对数据的拆分工作。
        简单通俗点说,举个例子,比如uint16或者int16类型的数据1000,把他转换成二进制格式就是 0000 0011 1110 1000 共16位,高八位为 0000 0011,低八位为 1110 1000 ,在前面我们介绍了大端模式和小端模式的区别,即小端系统,高位值存于高地址,低知位值存于低地址。大端系统,与小端系统相反,高位值存于低位地址,低位值存于高位地址。
        也是就说对于小端模式 调用BYTE0(1000)就可以获取数据1000的低八位1110 1000 ,BYTE1(1000)就可以获取1000的高八位高八位为 0000 0011 。对于大端模式 调用BYTE0(1000)就可以获取数据1000的高八位 0000 0011,BYTE1(1000)就可以获取1000的低八位高八位为1110 1000 。
       5、有了以上数据拆分的基础,接下来就可以把DATA区的数据放到数组里。
        还有一点需要注意由于本例中的匿名上位机DATA 数据内容中的数据,采用小端模式,低字节在前,高字节在后。 什么意思呢,这里的小端模式跟上文介绍的单片机的大小端模式无关,不是指同一个东西,这里的小端模式理解为我们向上位机发送数据的时候要先发送数据的低字节,再发送数据的高字节,因此我们在把DATA区的数据放到数组data_to_send里是要先放低字节,拿上文中的数据1000为例要先放1110 1000 再放 0000 0011,即对于小端模式的单片机先调用BYTE0(1000) ,再调用BYTE1(1000),而对于大端模式的单片机先调用BYTE1(1000),再调用BYTE0(1000)。因此对于本例传递4个int16类型的数据区代码如下:
        大端模式的单片机(比如常见的51单片机):
        data_to_send[_cnt++] = BYTE1(_a);
        data_to_send[_cnt++] = BYTE0(_a);
    	
        data_to_send[_cnt++] = BYTE1(_b);
        data_to_send[_cnt++] = BYTE0(_b);
    	
        data_to_send[_cnt++] = BYTE1(_c);
        data_to_send[_cnt++] = BYTE0(_c);
    	
        data_to_send[_cnt++] = BYTE1(_d);
        data_to_send[_cnt++] = BYTE0(_d);
    
        小端模式的单片机(比如常见的32单片机):
        data_to_send[_cnt++] = BYTE0(_a);
        data_to_send[_cnt++] = BYTE1(_a);
    	
        data_to_send[_cnt++] = BYTE0(_b);
        data_to_send[_cnt++] = BYTE1(_b);
    	
        data_to_send[_cnt++] = BYTE0(_c);
        data_to_send[_cnt++] = BYTE1(_c);
    	
        data_to_send[_cnt++] = BYTE0(_d);
        data_to_send[_cnt++] = BYTE1(_d);
    
        之前我写的时候就是因为没有区分大小端系统,我当时用的是STC8G单片机,本质上可以说属于51系列单片机,是大端模式的,我按照小端模式去写,结果就是虽然可以通过上位机的和校验、附加校验(道理很假单:加法交换律),但是上位机收到的数据指定是错误的。
       5、接下来就是和校验、附加校验的计算和将其放到数组里了。
       先简单介绍一下什么是和校验、附加校验(数据校验的目的是保证数据的有效性,完整性,准确性,避免因噪声或其他干扰造成的数据丢失造成的数据错误)
       和校验计算方法: 从帧头 0xAA 字节开始,一直到 DATA 区结束,对每一字节进行累加操作,只取低 8 位 。
       附加校验计算方法: 计算和校验时,每进行一字节的加法运算,同时进行一次 和校验的累加操作,只取低 8 位。
       不明白的话,看下面的程序就很容易理解了:
     for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];   //和校验
            addcheck += sumcheck;          //附加校验
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    
       在此解释一下为啥是 i < data_to_send[3]+4,根据和校验的定义是从帧头 0xAA 字节开始,一直到 DATA 区结束,而data_to_send[3]里面放的就是DATA区的数据个数而在DATA区之前还有0xAA、0xFF、0xF1、8(针对本文的例子而言) 这4个数据,所以是 data_to_send[3]+4。
       计算完后自然就是将其按照顺序放到数组data_to_send里了,到这里我们要发送的数据都按照通讯帧格式放到数组data_to_send里了。多说一句,DATA区里的数据才是我们真正想让上位机或者虚拟示波器显示的数据,发送的其他数据都是为了其能够正确发送和接收而设立的。
       6、最后一步:通过串口把data_to_send里的数据按字节依次发送到上位机或者虚拟示波器。串口发送函数因单片机不同,可能不同,大家改为自己单片机的就行,以下是我的单片机的串口发送程序:
    uart_putbuff(DEBUG_UART,data_to_send,_cnt);//函数功能:将data_to_send里的_cnt个数据,通过串口DEBUG_UART发送到上位机)
    
        到这里我们的数据通信程序就写完了,建立工程时将调用的数据拆分代码和函数的定义放在h文件中,如
    #ifndef __ANO_DT_H
    #define __ANO_DT_H
    //数据拆分宏定义,在发送大于1字节的数据类型时,比如int16、int32等,需要把数据拆分成单独字节进行发送
    #define BYTE0(dwTemp) (*(char *)(&dwTemp))
    #define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1))
    #define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
    #define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
    
    void ANO_DT_Send_F1(uint16 _a, uint16 _b, uint16 _c, uint16 _d);
    void ANO_DT_Send_F2(int16 _a, int16 _b, int16 _c, int16 _d);
    void ANO_DT_Send_F3(int16 _a, int16 _b, int32 _c);
    
    
        将我们写的数据通信程序放在c文件里,(不要忘记包含以上的头文件和你串口发送函数所在的头文件 )

    三、完整的数据通讯的程序例子:

       小端模式单片机,通过F1帧发送4个uint16类型的数据(也就是本文主要介绍的例子):
    uint8 data_to_send[100];
    
    
    void ANO_DT_Send_F1(uint16 _a, uint16 _b, uint16 _c, uint16 _d)   //F1帧  4个 uint16 参数
    {
        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
        data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0xFF;
        data_to_send[_cnt++] = 0xF1;
        data_to_send[_cnt++] = 8; //数据长度
        data_to_send[_cnt++] = BYTE0(_a);
        data_to_send[_cnt++] = BYTE1(_a);
    	
        data_to_send[_cnt++] = BYTE0(_b);
        data_to_send[_cnt++] = BYTE1(_b);
    	
        data_to_send[_cnt++] = BYTE0(_c);
        data_to_send[_cnt++] = BYTE1(_c);
    	
        data_to_send[_cnt++] = BYTE0(_d);
        data_to_send[_cnt++] = BYTE1(_d);
    
    	
    	  for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];
            addcheck += sumcheck;
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    		
    		uart_putbuff(DEBUG_UART,data_to_send,_cnt);  //读者记得修改串口发送函数
    }
    
    
       大端模式单片机,通过F1帧发送4个uint16类型的数据(也就是本文主要介绍的例子):
    uint8 data_to_send[100];
    
    
    void ANO_DT_Send_F1(uint16 _a, uint16 _b, uint16 _c, uint16 _d)   //F1帧  4个 uint16 参数
    {
        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
        data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0xFF;
        data_to_send[_cnt++] = 0xF1;
        data_to_send[_cnt++] = 8; //数据长度
        data_to_send[_cnt++] = BYTE1(_a);
        data_to_send[_cnt++] = BYTE0(_a);
    	
        data_to_send[_cnt++] = BYTE1(_b);
        data_to_send[_cnt++] = BYTE0(_b);
    	
        data_to_send[_cnt++] = BYTE1(_c);
        data_to_send[_cnt++] = BYTE0(_c);
    	
        data_to_send[_cnt++] = BYTE1(_d);
        data_to_send[_cnt++] = BYTE0(_d);
    
    	
    	  for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];
            addcheck += sumcheck;
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    		
    		uart_putbuff(DEBUG_UART,data_to_send,_cnt); //读者记得修改串口发送函数
    }
    
       小端模式单片机,通过F2帧发送4个int16类型的数据:
    uint8 data_to_send[100];
    
    void ANO_DT_Send_F2(int16 _a, int16 _b, int16 _c, int16 _d)   //F2帧  4个  int16 参数
    {
        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
       data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0xFF;
        data_to_send[_cnt++] = 0xF2;
        data_to_send[_cnt++] = 8; //数据长度
        data_to_send[_cnt++] = BYTE0(_a);
        data_to_send[_cnt++] = BYTE1(_a);
    	
        data_to_send[_cnt++] = BYTE0(_b);
        data_to_send[_cnt++] = BYTE1(_b);
    	
        data_to_send[_cnt++] = BYTE0(_c);
        data_to_send[_cnt++] = BYTE1(_c);
    	
        data_to_send[_cnt++] = BYTE0(_d);
        data_to_send[_cnt++] = BYTE1(_d);
    
    	
    	  for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];
            addcheck += sumcheck;
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    		
    	uart_putbuff(DEBUG_UART,data_to_send,_cnt);读者记得修改串口发送函数
    }
    
       大端模式单片机,通过F2帧发送4个int16类型的数据:
    uint8 data_to_send[100];
    
    void ANO_DT_Send_F2(int16 _a, int16 _b, int16 _c, int16 _d)   //F2帧  4个  int16 参数
    {
        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
        data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0xFF;
        data_to_send[_cnt++] = 0xF2;
        data_to_send[_cnt++] = 8; //数据长度
        data_to_send[_cnt++] = BYTE1(_a);
        data_to_send[_cnt++] = BYTE0(_a);
    	
        data_to_send[_cnt++] = BYTE1(_b);
        data_to_send[_cnt++] = BYTE0(_b);
    	
        data_to_send[_cnt++] = BYTE1(_c);
        data_to_send[_cnt++] = BYTE0(_c);
    	
        data_to_send[_cnt++] = BYTE1(_d);
        data_to_send[_cnt++] = BYTE0(_d);
    
    	
    	  for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];
            addcheck += sumcheck;
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    		
    	uart_putbuff(DEBUG_UART,data_to_send,_cnt);读者记得修改串口发送函数
    }
    
       小端模式单片机,通过F3帧发送2个int16类型和1个int32类型的数据:
    uint8 data_to_send[100];
    
    void ANO_DT_Send_F3(int16 _a, int16 _b, int32 _c )   //F3帧  2个  int16 参数   1个  int32  参数
    {
        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
        data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0xFF;
        data_to_send[_cnt++] = 0xF3;
        data_to_send[_cnt++] = 8; //数据长度
        data_to_send[_cnt++] = BYTE0(_a);
        data_to_send[_cnt++] = BYTE1(_a);
    	
        data_to_send[_cnt++] = BYTE0(_b);
        data_to_send[_cnt++] = BYTE1(_b);
    	
        data_to_send[_cnt++] = BYTE0(_c);
        data_to_send[_cnt++] = BYTE1(_c);
        data_to_send[_cnt++] = BYTE2(_c);
        data_to_send[_cnt++] = BYTE3(_c);
    
    	
    	  for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];
            addcheck += sumcheck;
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    		
    	uart_putbuff(DEBUG_UART,data_to_send,_cnt); 读者记得修改串口发送函数
    }
    
       大端模式单片机,通过F3帧发送2个int16类型和1个int32类型的数据:
    uint8 data_to_send[100];
    
    void ANO_DT_Send_F3(int16 _a, int16 _b, int32 _c )   //F3帧  2个  int16 参数   1个  int32  参数
    {
        uint8 _cnt = 0;
        uint8 sumcheck = 0; //和校验
        uint8 addcheck = 0; //附加和校验
        uint8 i=0;
        data_to_send[_cnt++] = 0xAA;
        data_to_send[_cnt++] = 0xFF;
        data_to_send[_cnt++] = 0xF3;
        data_to_send[_cnt++] = 8; //数据长度
        data_to_send[_cnt++] = BYTE1(_a);
        data_to_send[_cnt++] = BYTE0(_a);
    	
        data_to_send[_cnt++] = BYTE1(_b);
        data_to_send[_cnt++] = BYTE0(_b);
    	
        data_to_send[_cnt++] = BYTE3(_c);
        data_to_send[_cnt++] = BYTE2(_c);
        data_to_send[_cnt++] = BYTE1(_c);
        data_to_send[_cnt++] = BYTE0(_c);
    
    	
    	  for ( i = 0; i < data_to_send[3]+4; i++)
        {
            sumcheck += data_to_send[i];
            addcheck += sumcheck;
        }
    
        data_to_send[_cnt++] = sumcheck;
        data_to_send[_cnt++] = addcheck;
    		
    	uart_putbuff(DEBUG_UART,data_to_send,_cnt); 读者记得修改串口发送函数
    }
    
    
       相信通过以上的例子大家可以自己按照自己需要的数据个数和类型自己写(或者改)数据通信程序了

    四、匿名上位机的相关配置,本部分内容参考自匿名匿名通信协议V7.00 (对于不是用的匿名上位机的,可跳过此部分内容)

    在这里插入图片描述
    在这里插入图片描述

    五、上位机显示效果示例 :

       如我们随意发送的3个数据如下:
    int16 s1=0, s2=0;
    int32 s3=0;
    
    
     while(1)
    	{
    		 ANO_DT_Send_F3(s1, s2, s3 );
    		 s1+=1;
    		 if(s1>100)
    			 s1=0;
    		 s2=50*sin(100*s1)+5;
    		 s3=50*sin(100*s1+10*s2);
    		 pca_delay_ms(500);   //延时每500ms发送一次
    
        }
    
       以下界面说明数据通过了和校验、附加校验:

    在这里插入图片描述
    在这里插入图片描述

       变量s1:

    在这里插入图片描述

       变量s2:

    在这里插入图片描述

       变量s3:

    在这里插入图片描述

       变量s1、s2、s3共同显示:

    在这里插入图片描述

       到这里本文就结束了,希望对大家有所帮助,欢迎大家积极在评论区交流,本文的例子匿名上位机可到匿名的官方QQ群获取,找不到的可以在评论区给我留言,本文的例子的c文件(以大端模式为例)和h文件会放在附件中,附件失效或者过高也可在评论区留言。
    展开全文
  • PHP邮件发送类,添加发送附件

    千次阅读 2015-02-13 14:30:01
    * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件的邮件 * 需要的php扩展,sockets和Fileinfo。 * @example * $mail = new MySendMail(); * $mail->setServer
  • 利德商务邮件发送

    2006-09-17 01:22:05
    9、 用户可自主选择匿名或不匿名发送EMAIL ;选择匿名发送,对方无法知道发送者是谁 10、 可直接发送网页 ,您只需将网页或HTML代码发出,对方即可收到丰富的网页内容; 11、 可直接发送网站 ,您只要输进网址,...
  • 发送邮件相关

    2019-05-29 16:40:03
    通过smtplib模块发送邮件主要分为四个步骤: 1、实例化SMTP对象 2、连接SMTP服务器 3、登录账号 4、编辑邮件内容 5、发送邮件 纯文本邮件 先看一个简单的代码例子 运行上面的脚本,收到的邮件如下: ...
  • 服务器已经搭建好了,但是发送不出去,如下图就一直卡在那里 ![图片说明](https://img-ask.csdn.net/upload/201505/08/1431087621_493620.png) 我使用的是云服务器 下面是我的main.cf配置 myhostname = 10-4-22-248 ...
  • <?... class Ems ... * @title 发送验证码 * @description 发送验证码 * *@param name:mail type:string require:1 other:邮箱账号 *@param name:event type:int require:0 other:事件,如注册reg...
  • 发送邮件:SMPT、MIME,是一种基于"推"的协议,通过SMPT协议将邮件发送至邮件服务器,MIME协议是对SMPT协议的一种补充,如发送图片附件等 接收邮件:POP、IMAP,是一种基于"拉"的协议,收件人通过POP协议从邮件...
  • 6.1 匿名的基础知识

    2018-09-12 14:04:48
    匿名的定义在讨论比特币是否具备匿名性之前,我们需要对匿名做一个定义。我们需要准确地理解到底什么是匿名,以及它与其他一些相似术语的关系,比如隐私。匿名和化名(pseudonymity)在其他你可能更熟悉的情形下,...
  • 匿名数传使用方法分享

    千次阅读 2018-11-11 15:40:42
    目录欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants...
  • 该机器人的工作方式是,用户将消息发送给请求匿名消息服务的人,或者将消息发送给其他人,该消息首先发送给该机器人,然后再发送给其他人。发送与代理工作非常相似 可能性: 回复消息的能力(重播) 收到新消息时...
  • Java发送Mail总结

    千次阅读 2015-04-20 18:03:50
    让其折磨的够呛,何不彻底弄懂 一个简单的mail组成部分 ...// 指定发送邮件的主机为 localhost ...// 以匿名内部类的形式创建登录服务器的认证对象 ...然后我们发送的邮件里面就能引用到这个图片啦! Done!
  •  Spring提供了发送电子邮件的功能,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理。JavaMailSenderImpl是个普通的Java Bean,可以在配置文件中配置,也可以在程序中动态地创...
  • 邮件发送功能开发

    2017-08-12 21:37:00
    邮件发送"功能的开发和使用是必须要掌握的,因为这个功能作为“消息推送”的一种手段经常出现在各种.Net系统中,所以本文将对.Net平台下的“邮件发送”,做一个细致的分析! 一、who需要邮件功能 1、服务提供方:需...
  • 博主最近学了一点爬虫的知识,闲着无聊,秉承学以致用的理念,于是突然想到何不挑战一下,爬取一些叔叔不约网站的图片,来巩固一下所学知识(#滑稽)。说干就干,打开eclipse或idea,创建maven工程,引入所需jar包的...
  • json发送数据加密方法Do you need to send someone sensitive information through email? Regular email is sent “in the clear” and therefore is subject to interception by hackers. However, there are many...
  • python实现smtp协议发送邮件

    千次阅读 2018-09-10 18:37:48
    #这里sender和mail_user要一致,腾讯可能不让匿名发送邮件 sender = 'xxxxxxxxxxxx@qq.com' receivers = ['xxxxxxx@qq.com'] #接受者的邮箱 # 创建一个带附件的实例 message = MIMEMultipart() message['From'] = ...
  • Spring提供了非常好用的JavaMailSender接口实现邮件发送。在Spring Boot中也提供了相应的自动化配置。 这篇文章主要讲如何在Spring Boot中使用JavaMailSender发送邮件。 发送邮件 1,在pom.xml中引入spring-boot-...
  • RocketMQ 消息发送的基本样例 “一发、一存、一消费” 是消息中间件的本质,本文简单的记录来RocketMQ消息的基本样例,包含消息的发送(同步消息/异步消息/单向消息)、消息消费(负载均衡模式/广播模式)、顺序消息...
  • 支持发送自定义图片 支持通过输入法键盘输入emoji并发送 后台管理实时监控 后台上传情头和创建话题 后台查看房间聊天记录 倒计时快结束时,可以延长房间时间 聊天内容过滤 -> 服务端安装教程 导入anonymous_chat.sql...
  • php实现发送邮件,ssl版,QQ邮箱可用,有些同学的实现不...现在我们先贴上邮箱发送的类代码 &lt;?php /** * 一个简单的PHP SMTP 发送邮件类 */ class Lib_Smtp { /** * @var string 邮件传输代理用户名 *...
  • 该网站包括所有内容:图片,CSS,JavaScript等 电子邮件接收服务器 用于维护,测试等的附加实用程序 如何设置SQL表 不包含的内容: Web服务器,数据库服务器或任何其他外部实用程序的配置 启动和监视网站
  • PHP实现匿名聊天室

    2020-01-15 21:33:52
    第一个模块是已经加入的聊天室,根据用户账号检索角色表,获得加入的房间id,并在页面中以块(图片廓)的形式显示出来,用户进入时使用之前的身份。第二个模块是对房间表所有房间的查询,并使用count统计每个房间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,985
精华内容 8,794
关键字:

如何匿名发送图片