2021년 1월 14일 목요일

Java CRC16 Modbus

프로젝트 진행중에 필요하여 찾아보았더니 역시나 잘 구현된것들이 있었다.

간편하게 사용할 수 있도록 일부 수정 하였다.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.util.zip.Checksum;


public class CRC16Modbus implements Checksum {
    private static final int[] TABLE = {
            0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
            0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
            0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
            0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
            0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
            0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
            0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
            0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
            0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
            0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
            0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
            0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
            0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
            0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
            0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
            0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
            0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
            0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
            0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
            0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
            0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
            0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
            0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
            0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
            0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
            0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
            0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
            0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
            0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
            0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
            0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
            0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
    };


    private int sum = 0xFFFF;

    public long getValue() {
        return sum;
    }

    public void reset() {
        sum = 0xFFFF;
    }

    public void update(byte[] b, int off, int len) {
        for (int i = off; i < off + len; i++)
            update((int) b[i]);
    }

    public void update(int b) {
        sum = (sum >> 8) ^ TABLE[((sum) ^ (b & 0xff)) & 0xff];
    }

    public byte[] getCrcBytes() {
        long crc = (int) this.getValue();
        byte[] byteStr = new byte[2];
        byteStr[0] = (byte) ((crc & 0x000000ff));
        byteStr[1] = (byte) ((crc & 0x0000ff00) >>> 8);
        return byteStr;
    }
    
    public byte[] getCRC16Modbus(int[] data) {
//    	CRC16Modbus crc = new CRC16Modbus();
    	byte[] result = new byte[2];
        for (int d : data) {
            update(d);
        }
        result[0] = (byte) ((getValue() & 0x000000ff));
        result[1] = (byte) ((getValue() & 0x0000ff00) >>> 8);    	
    	return result;
    }

    public static void main(String[] args) {
    	byte[] crc = new byte[2];
    	CRC16Modbus crc16Modbus = new CRC16Modbus();

    	// Command value
    	int[] data = new int[] {0x01, 0x03, 0x00, 0x00, 0x00, 0x38};
    	
    	crc = crc16Modbus.getCRC16Modbus(data);
    	System.out.printf("byteStr[0] = %02X, byteStr[1] = %02X\n", crc[0], crc[1]);
    }
}

2020년 4월 21일 화요일

Module not found error: no module named 'pi_sht1x'

이번에 sht1x 타입의 온도계로 프로젝트를 진행하였다.
python3 xxx.py 로 실행 할땐 잘 되었는데
서비스로 등록해서 실행하면 제목과 같은 에러가 발생 하였다.

문제는 root계정에 해당 모듈이 설치 되지 않음이었다.

sudo pip3 install pi-sht1x

위와 같이 실행하여 root계정에도 해당 모듈을 설치하여 해결하였다.

간단한 문제였는데 생각보다 시간을 소비한듯 하다 ㅠㅠ

2020년 4월 10일 금요일

SVN Apache2 dav_svn.conf 설정

Alias /svn /home/svn
<Location /svn>
        DAV svn
        SVNParentPath /home/svn
        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile /home/svn/dav_svn.passwd
        Require valid-user
        SVNAdvertiseV2Protocol off
</Location>

아래 두가지가 빠져서 계속해서 /svn/repos/!svn/me path not found 이런 에러가 발생했다.
Alias 설정은 하다가 빼먹은거고 Protocol설정은 apache2.4에서 발생하는 문제라고 한다.
Alias /svn /home/svn
SVNAdvertiseV2Protocol off

2020년 4월 7일 화요일

Start Spring

사내 서버파트 등의 개발을 위해 스프링과 전자정부프레임워크를 저울질 하다가
전자정부 도입 하려다가 스프링으로 돌아섰다.
어차피 어느정도 그놈이 그놈이긴 할텐데 아무래도 스프링이 자료가 더 풍부하고 좀더 수월 할 듯 하여
결국엔 스프링으로 결정이 났다.

해서 스프링 개발 환경을 구축 하였다.

이클립스에서 스프링 개발환경 구축하기 위한 스프링툴 설치.
이클립스 마켓플레이스에서 스프링검색후에 Spring Tools 4를 설치 하였다.

아직 사내에서 한번도 안해본 녀석이라 업무에 맞게 나누어 구현에 관한 자료를 수집하고
구현과 테스트를 반복하는 노가다를 이제 시작 하려고 한다.

2020년 3월 17일 화요일

Ofbiz IntelliJ 개발환경 설정

사내 프로젝트로 ERP를 진행중인데 Ofbiz를 사용 하기로 했다.
최신 버전이 gradle로 빌드하도록 되어 있어서 IntelliJ를 사용하여 환경을 만들려고 시도 중이다.

IntelliJ에서 Subversion으로 framework의 trunk 소스 받고나서 확인해보면
plugin 폴더가 비어 있다.

번거롭지만 따로 받아 넣어 주어야 한다.

왜 plugin을 따로 분리해두었을까....


2020년 3월 13일 금요일

iOS앱 배포 삽질 스토리1

100만년만에 iOS앱 개발 및 배포를 진행 하게 되었다.
100만년이란 긴 시간 동안 언어도 바뀌어서 swift로 개발을....
object-c보다는 아주 많이 좋아 진듯 하다.
xcode가 그지같은건 여전한듯 하고...

각설하고 심사를 올렸는데 하루만에 반려되었다.
원인은 요거

Guideline 2.2 - Performance - Beta Testing



Your app appears to be a pre-release, test, or trial version with a limited feature set. Apps that are created for demonstration or trial purposes are not appropriate for the App Store.

Next Steps

To resolve this issue, please complete, remove, or fully configure any partially implemented features. Additionally, remove all references to "demo," "trial," "beta," or "test" in your app description, app icon, screenshots, previews, release notes, and binary.

Resources

If you would like to conduct a beta trial for your app, you may wish to review the TestFlight Beta Testing Guide.

Please see attached screenshots for details.

더 아래 보니 스크린샷을 첨부해 주셨다.
테스트 연구동이라고 해서 테스트배드라고 적어둔게 문제가 된듯 하다. ㅠㅠ
스크린샷을 다시 찍어 올려야겠다.

2020년 3월 12일 목요일

Ubuntu Server 18.04 SVN Apache2 연동하기

SVN과 Apache2 설치는 생략...


apache와 svn연동에 필요한 모드 설치
sudo apt-get install libapache2-mod-svn

repository 생성
mkdir /home/svn
svnadmin create /home/svn/repos
chown -R www-data:www-data /home/svn/repos

vi /etc/apache2/mods-available/dav_svn.conf
아래 내용 편집

<Location /svn>
     DAV svn
     SVNParentPath /home/svn
     AuthType Basic
     AuthName "Subversion Repository"
     AuthUserFile /etc/apache2/dav_svn.passwd
     Require valid-user
</Location>

svn password 파일 생성과 사용자 생성
htpasswd -cm /home/svn/dav_svn.passwd [user_name]

아파치 재시작
/etc/init.d/apache2 restart

여기까지가 기본 설정 완료

mkdir TestProject
svn

2024년 여섯번째 도서 리뷰 [무엇이 1등 팀을 만드는가]

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다. 올해의 마지막 서평이다. 무엇이 1등 팀을 만드는가.... 시작하기에 앞서 제목이 과하지 않은가 하는 생각이 든다. 1등 팀이라....예전 어느 개그 프로에서 ...